启动项目时出现:http://localhost:8080/login页面

149 阅读3分钟

image.png

持续创作,加速成长!这是我参与「掘金日新计划 · 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(下图中的随机密码)

image.png

怎么解决这个问题:

只需要在 启动类 上加一个参数,过滤掉 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加密生成的密文) 就很大可能被暴力破解。当然我们也可以使用 加盐 的方式。但有两个问题:

  1. 如果是加 静态盐,那其实就和单纯的 md5 加密一样。
  2. 如果使用 随机盐,那么就需要自己实现一个 BCrypt 中的 matches() 方法,来进行判断。

所以还是更推荐使用 BCrypt ,更简单、方便。

记录日常出现的问题。既加深了印象,又有利于复习回顾!