持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
最近在使用 md5(摘要加密)+随机加盐 的时候,启动项目便会出现上面这个页面。
第一次出现这个页面的时候,我直接就懵了(这是什么意思?我没写这个页面啊!)。
后来经过度娘才发现了问题:
由于我在代码中使用了 BCrypt(md5+随机盐) 来进行加密:
@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;
private RSA rsa;
public String encrypt(String password){
// 获取 公钥和私钥
String[] key = getKey();
rsa = new RSA(key[0],key[1]);
// 通过 BCrypt (md5 + 随机加盐) 进行加密
String encode = bCryptPasswordEncoder.encode(password);
// 通过 非对称加密 再次包裹一层
byte[] decrypt = rsa.encrypt(encode, KeyType.PublicKey);
// 返回 密文
return Base64.encode(decrypt);
}
而 BCrypt 是属于 security 框架下的一个类。所以在使用 BCrypt 之前就需要在 pom.xml 中引入 security 这个依赖。
<!-- security -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
</dependency>
这时就出现了问题,因为 security 框架是一个安全的 框架,所以它会保护所有的接口。这时我们在通过浏览器访问时就需要进行身份认证。
用户名是 : user
密码是一串随机的字符 : fd9ad4f6-4a0f-4096-9680-9dfdc1f736fe(下图中的随机密码)
怎么解决这个问题:
只需要在 启动类 上加一个参数,过滤掉 SpringSecurity 框架的默认配置。
@SpringBootApplication(exclude = {org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class })
BCrypt 与 md5 的区别:
BCrypt :
这是一个加密工具,它将 md5 + 随机盐 的加密方式进行了封装,让我们使用起来变得 方便、简单。
它主要有两个方法 encode() 和 matches()。
encode(需要加密的字符串) : 加密方法,将一个字符串通过 md5 + 随机盐 的方式进行加密并生成一个 60 位的密文。
matches(原字符串, BCrypt生成的密文) : 判断一个字符串通过 BCrypt 加密能否得到 BCrypt 生成的密文。
md5 : 摘要加密,只要是同一个字符串,那么经它加密得到的密文就是一样的。同时它的密文是 32 位。并且一旦加密,就不能拿到原始的密码。想要判断原密码的正确与否,只能将原密码也进行 md5 加密,然后判断 两个密文 是否相同。
由于 md5 加密生成的密文是一样的,所以安全性比 BCrypt 低很多。通过 彩虹表(存放了许多字符串通过md5加密生成的密文) 就很大可能被暴力破解。当然我们也可以使用 加盐 的方式。但有两个问题:
- 如果是加 静态盐,那其实就和单纯的 md5 加密一样。
- 如果使用 随机盐,那么就需要自己实现一个 BCrypt 中的 matches() 方法,来进行判断。
所以还是更推荐使用 BCrypt ,更简单、方便。
记录日常出现的问题。既加深了印象,又有利于复习回顾!