摘要认证的密码加密

在之前的案例中,我们的密码都是以明文形式存储在数据库中,明文存储给系统安全带来了极大的风险。本节将演示在摘要认证中,实现对密码进行加密存储。

digest-authentication项目的基础上,我们构建了一个digest-password-encode项目。

build.gradle

修改 build.gradle 文件,让我们的digest-password-encode项目成为一个新的项目。

修改内容也比较简单,修改项目名称及版本即可。

jar {
    baseName = 'digest-password-encode'
    version = '1.0.0'
}

密码加密算法

Spring Security 所使用的密码加密算法格式为 HEX( MD5(usernamepassword) )所以,当我们使用账号 waylau 密码 123456 时,生成的密码如下:

waylau:spring security tutorial:123456  -> b7ace5658b44f7295e7e8e36da421502

具体生成的密码的代码可以看 ApplicationTests.java:

@Test
public void testGenerateDigestEncodePassword() {
    String username = "waylau";
    String realm = "spring security tutorial";
    String password = "123456";
    String a1Md5 = this.encodePasswordInA1Format(username, realm, password);
    System.out.println("a1Md5:" + a1Md5);
}
private String encodePasswordInA1Format(String username, String realm, String password) {
    String a1 = username + ":" + realm + ":" + password;
    return md5Hex(a1);
}
private String md5Hex(String data) {
    MessageDigest digest;
    try {
        digest = MessageDigest.getInstance("MD5");
    }
    catch (NoSuchAlgorithmException e) {
        throw new IllegalStateException("No MD5 algorithm available!");
    }
    return new String(Hex.encode(digest.digest(data.getBytes())));
}

这样,我们的数据库中可以存储加密后的密码,这样,就避免了明文存储的风险。

在初始化用户时,我们把加密后的密码存储进数据库:

INSERT INTO user (id, username, password, name, age) VALUES (1, 'waylau', 'b7ace5658b44f7295e7e8e36da421502', '老卫', 30);
INSERT INTO user (id, username, password, name, age)  VALUES (2, 'admin', 'b7b20c789238e2a46e56b533c87e673c', 'Way Lau', 29);

如果启用密码加密机制

DigestAuthenticationFilter.passwordAlreadyEncoded 设置为 true 即可:

@Bean
public DigestAuthenticationFilter digestAuthenticationFilter(
        DigestAuthenticationEntryPoint digestAuthenticationEntryPoint) throws Exception {
    DigestAuthenticationFilter digestAuthenticationFilter = new DigestAuthenticationFilter();
    digestAuthenticationFilter.setAuthenticationEntryPoint(digestAuthenticationEntryPoint);
    digestAuthenticationFilter.setUserDetailsService(userDetailsService);
    digestAuthenticationFilter.setPasswordAlreadyEncoded(true); // 密码已经加密
    return digestAuthenticationFilter;
}

限制

除默认的加密方式外,不能在摘要认证上采用其他的密码加密方式。

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「方志朋」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

results matching ""

    No results matching ""