1. 前言
本文 主要实现 对密码进行加密 ,因为 使用 md5 容易被穷举 (彩虹表) 而破解 ,使用 spring security
框架又太大了 (杀鸡用牛刀) 。
所以本文 就自己实现一个密码加密 .
2. 密码加密
这里我们通过 加盐是方式 来 对密码进行加密 .
加盐 通常分为两部分 :
- 盐值 : 通常使用随机数
- 加密数据
将盐值与加密数据合在一起 就是 加盐数据了 , 加盐数据通常来说是安全的
这里我们 盐值 是 随机的 每次加盐的数字都是不同的,这里通过穷举 来 破解我们的数据 假设破解 一条数据 花费的时间 1 天 , 我们 有 1 千w 个数据, 一个数据
是一天 , 那么 1 千 w 个数 , 全部破解 时间是非常多的 .
这里成本大于利益 , 那么谁去破解呢 , 所以这样做 我们的密码 就是安全的 .
知道加盐 , 下面就来自己实现一个加盐的方法
- 加密 : 随机盐 +
$
+ 最终加密密码 - 解密 : 先通过 $ 进行分割 , 得到随机盐 + 最终密码 ,然后通过 md5 对 新输入的密码 与 得到的随机盐 进行加密 , 将得到的 新的加密密码 和 之前分割得到的 最终密码 进行对比 如果 相等 那么 就是相同的密码 返回 true,如果不相等 就是不同的密码 返回 false
代码实现 :
这里我采用 的 是 使用 hutool
中的 MD5 进行 加密 的 所以需要引入 依赖
<!-- 添加 hutool --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.12</version></dependency>
创建一个 PasswordUtil &#xff0c; 在这个类里面完成我们的加密和 解密 .
package com.example.usermanager.tools;import cn.hutool.core.util.IdUtil;
import cn.hutool.crypto.SecureUtil;
import org.springframework.util.StringUtils;import java.util.UUID;public class PasswordUtil {public static String encrypt(String password) {String salt &#61; IdUtil.simpleUUID();String finalPassword &#61; SecureUtil.md5(salt &#43; password);return salt &#43; "$" &#43; finalPassword;}public static boolean decrypt(String password, String securePassword) {boolean result &#61; false;if (StringUtils.hasLength(password) && StringUtils.hasLength(securePassword)) {if (securePassword.length() &#61;&#61; 65 && securePassword.contains("$")) {String[] securePasswordArr &#61; securePassword.split("\\$");String salt &#61; securePasswordArr[0];String finalPassword &#61; securePasswordArr[1];password &#61; SecureUtil.md5(salt &#43; password);if (finalPassword.equals(password)) {result &#61; true;}}}return result;}public static void main(String[] args) {String password &#61; "123456";String dbPassword &#61; PasswordUtil.encrypt(password);System.out.println("加密密码 " &#43; dbPassword);boolean result &#61; PasswordUtil.decrypt("123456",dbPassword);String password2 &#61; "123456789";boolean result2 &#61; PasswordUtil.decrypt(password2,dbPassword);System.out.println(result);System.out.println(result2);}
}
效果 &#xff1a;
扩展 &#xff1a; 这里我们可以 对 加密密码 进行一个对称加密 &#xff0c;对称加密后得到一个 32 位 数据 , 我们的程序可以通过 公钥 对 32 数据 还原 &#xff0c;然后再通过我们写的 decrypt 进行 解密 .
这里主要是一个小功能&#xff0c; 可以将这个加密 放在我们的项目中 .