文章目录

  • 1、明文存储(极不推荐)
  • 2、使用MD5或其它算法哈希后存储(较不推荐)
  • 3、加盐后哈希存储(较推荐)
  • 4、使用BCrypt算法加密后存储(非常推荐)
  • 5、Spring Boot中使用jbcrypt对明文进行加密

1、明文存储(极不推荐)

  • 这种设计思路非常简单,但是缺陷也非常明显,数据库一旦泄露,那么所有用户名和密码都会泄露,后果非常严重。

2、使用MD5或其它算法哈希后存储(较不推荐)

  • MD5算法的原理可简要的叙述为:MD5码以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
  • 假如你设置的密码是123456,使用MD5后那数据库中存储的就是4QrcOUm6Wau+VuBX8g+IPg==,当用户登陆的时候,会把用户输入的密码执行MD5后再和数据库就行对比,判断用户身份是否合法,这种加密算法称为散列(哈希)。
  • 但是这种方式使用同一个密码进行哈希得到的密文始终是一样的,考虑到多数人所使用的密码为常见的组合,攻击者可以将所有密码的常见组合进行单向哈希,得到一个密文组合,然后与数据库中的摘要进行比对即可获得对应的密码,这个密文组合也被称为彩虹表(rainbow table)。

3、加盐后哈希存储(较推荐)

通过在密码任意固定位置插入特定的字符串,使其不再是人们常用的组合,让散列后的结果和使用原始密码的散列结果不相符,这种过程称之为“加盐”。用户密码+salt之后,进行哈希散列,再保存到数据库,数据库同时存储MD5值和salt盐值,验证正确性时使用salt进行MD5即可,这样可以有效应对彩虹表破解法。使用加盐,需要注意一下几点:

  • 不能在代码中写死盐,且盐需要有一定的长度(盐写死太简单的话,可能被注册几个账号反推出来)
  • 每一个密码都有独立的盐,并且盐要长一点,比如超过 20 位。(盐太短,加上原始密码太短,容易破解)
  • 最好是随机的值,并且是全球唯一的,意味着全球不可能有现成的彩虹表给你用。

4、使用BCrypt算法加密后存储(非常推荐)

  • 即使是加了盐,密码仍有可能被暴力破解,因此,我们可以采取更慢一点的算法,让黑客破解密码付出更大的代价,甚至迫使他们放弃。BCrypt生而为保存密码设计的算法,相比 MD5要慢很多。BCrypt比MD5慢几十倍,黑客想暴力破解的话,就需要花费几十倍的代价,因此一般情况,建议使用Bcrypt来存储用户的密码。
  • 常见的加密算法MD5只要是相同的salt和原密码,加密后产生的密串都是一致的,而对于BCrypt算法,使用相同的明文,每次生成的新的加密字符串都不一样

5、Spring Boot中使用jbcrypt对明文进行加密

当然我们也可以使用Spring Security中的BCryptPasswordEncoder进行加密,不过使用方法需要引入Spring Security框架,造成项目臃肿。此外,只要在pom.xml文件中导入Spring Security依赖,如果不进行配置,整个项目的接口请求路径都会被拦截,如果只是想单纯的使用BCrypt算法将密码进行加密,更加轻量且无需配置的jbcrypt是更好的选择。

  • 5.1 在pom.xml中导入maven依赖
<dependency><groupId>org.mindrot</groupId><artifactId>jbcrypt</artifactId><version>0.4</version>
</dependency>
  • 5.2 新建并编写JbcryptUtil工具类
import org.mindrot.jbcrypt.BCrypt;public class JbcryptUtil {/*** @param password 明文密码* @return 加密后的密码* @Description 对明文密码进行加密, 并返回加密后的密码*/public static String encode(String password) {return BCrypt.hashpw(password, BCrypt.gensalt());}/*** @param rawPassword     明文密码* @param encodedPassword 加密后的密码* @return boolean* @Description 将明文密码跟加密后的密码进行匹配,如果一致返回true,否则返回false*/public static boolean match(String rawPassword, String encodedPassword) {return BCrypt.checkpw(rawPassword, encodedPassword);}
}
  • 5.3 在注册的时候调用encode()方法将加密后的密码存储到数据库中,登录的时候调用match()方法将用户输入的密码与数据库中存储密码进行匹配验证

如何安全的存储用户密码相关推荐

  1. 程序员必备基础:如何安全传输存储用户密码?

    前言 我们开发网站或者APP的时候,首先要解决的问题,就是「如何安全传输和存储用户的密码」.一些大公司的用户数据库泄露事件也时有发生,带来非常大的负面影响.因此,如何安全传输存储用户密码,是每位程序员 ...

  2. golang pbkdf2加密存储用户密码

    概述 PBKDF2(Password-Based Key Derivation Function) 是一个用来导出密钥的函数,常用于生成加密的密码.原理是通过 password 和 salt 进行 h ...

  3. 如何安全存储用户密码/数据库安全存储密码的方式

    总的来讲,目前公认比较安全的存储密码方式是PBKDF2, BCrypt 或 SCrypt 算法产生的密码. 历史上密码加密存储经历了如下几个阶段: 1. 单向hash(MD5) 做单向的hash加密, ...

  4. 获取令牌密码_如何真正存储用户密码和api令牌(即密码)

    获取令牌密码 A cliché in posts detailing password storage schemes is to finish by telling the syadmins and ...

  5. 存储用户密码应该使用什么加密算法?比较合适

    概述 编程开发中,像用户登录注册这种功能很常见,那么对于用户密码处理,我们该选择什么样的加密算法呢?在这种场景下,算法需要满足下面两个条件: 算法需不可逆,这样才能有效防止密码泄露. 算法需相对慢,可 ...

  6. Dropbox怎么安全地存储用户密码?

    使用的朋友都知道,DropBox是一个文件云端存储.备份.共享的软件.在 Dropbox 平台上,用户可以进行线上储存.共享协作.管理文档照片等各类资料.DropBox同时提供Windows.Linu ...

  7. 如何安全的存储用户密码?(中)代码篇

    PHP PBKDF2 密码hash代码 <?php /* * Password Hashing With PBKDF2 (http://crackstation.net/hashing-secu ...

  8. 用户密码加密存储十问十答,一文说透密码安全存储

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | 程序员赵鑫 来源 | cnblogs.com/xinzh ...

  9. python获取数据库用户名密码_在数据库中存储用户和密码

    我正在创建一个用户+密码的软件.认证后,用户可以访问一些半公共服务,但也可以加密一些只有用户才能访问的文件.在 用户必须按原样存储,如有可能,无需修改.在auth之后,只要软件还在运行,用户和密码都会 ...

最新文章

  1. 用C语言解“分段计算居民水费”题
  2. Netty详解(四):Netty 整体架构
  3. sqlite3 改源代码支持上下键查询历史命令
  4. springboot pom文件指定jdk_Spring Boot 入门
  5. AndroidStudio cmakelist找不到问题
  6. python考试题库程序改错_求助,程序改错
  7. 计算机文档用什么翻译,Word文档翻译在哪里(适于Word2010-Word2016)?
  8. oracle查锁及解锁命令
  9. Linux常用命令3
  10. 移动web端的react.js组件化方案
  11. html页面缩小布局乱了为什么啊_PPT页面总是太空?这4个方法,让你的PPT增加亿点点细节!...
  12. 虚拟化:侧信道攻击案例
  13. 自动化测试(AT)与探索性测试(ET)
  14. 深入探访支付宝双11十年路,技术凿穿焦虑与想象极限
  15. 如何平衡MMO游戏 ——Einsphoton
  16. matlab wiggle打开,wig、bigWig和bedgraph文件详解
  17. 你连《Android高级UI与FrameWork源码》都搞不懂学什么Android?还敢面试阿里P7!
  18. 夏普linux电视软件,夏普电视第三方软件安装方法,使用教程和攻略
  19. 2016年各大安卓渠道最新商务合作通讯录
  20. 【HJZS-E202 AC220V断电延时继电器】

热门文章

  1. 通过matlab进行绩效,浅谈matlab在企业人力资源绩效评价体系中的应用
  2. 降低电商快递运输成本的6种策略
  3. android 内存溢出问题分析
  4. 【CET4四级英语】【单词】单词的同义替换(1)
  5. R基础学习(一)数据结构
  6. 实习周记(附):学习笔记
  7. 百度地图根据经纬度绘制轨迹
  8. 哈工大青企联理事会圆满举办,数海信息CEO刘志欣当选第一届副会长
  9. STM32Cube_FW_F4_V1.17 F4固件包百度网盘下载
  10. sa-token 注解式鉴权