0 前言
众所周知,密码肯定不能用明文存储。
之前一直使用MD5进行加密,现在才知道有彩虹表这回事。所以记录一下对应的处理方式:加密盐。
1 彩虹表
例如用MD5加密,随便没法破解,但是有些常用的字符被收集到彩虹表里那就危险了。
例如:123456
使用MD5加密(32小写)后为:e10adc3949ba59abbe56e057f20f883e
一旦这个字符串被泄露,那么使用这个密码的用户就有极大的风险。
2 加密盐
加密盐(Salt)是一种在密码学中用于增加密码存储安全性的技术。盐通常是一个随机生成的字符串,它被添加到原始密码的前端、后端或嵌入到密码中间,然后再与密码一起进行哈希运算。这样做的目的是为了增加密码破解的难度,特别是针对彩虹表攻击(一种预先计算好的哈希值对照表,用于快速查找密码)和暴力破解攻击。
2.1 手搓加密盐
2.1.1 密码加盐(加密)
输入密码
↓
产生盐值 -> 唯一字符串
↓
盐值拼接字符串 生成加盐后的密码
↓
加盐后的密码再次拼接输入的密码,生成最终的密文
2.1.2 密码验证
输入用户+密码
↓
查出用户的密码
↓
密码分割,找出密码的盐值
↓
用户输入的密码+盐值 进行加密
↓
拼接后 得到的加密值与查出的密码进行对比验证
↓
后续操作
2.1.3 工具类
/**
* 1.加盐并生成最终的密码
*
* @param password 明文的密码
* @return 最终生成的密码
*/
public static String encrypt(String password) {
//a.产生盐值
//UUID.randomUUID()会生成32位数字+4位-,是随机的唯一的,将4位-去掉就得到32位数字的盐值
String salt = UUID.randomUUID().toString().replace("-", "");
//生成加盐后的密码(需要使用MD5)
String saltPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
//生成最终的密码格式
String finalPassword = salt + "#"