繁体   English   中英

MD5编码结果不同

[英]MD5 encoding with different results

我遇到了MD5编码这个奇怪的问题。 实际上,在每个人都告诉我不要使用MD5之前:这是一个旧系统,算法已经被选择。

无论如何-我有一个存储了MD5哈希密码的MySQL表。 在同一表中,还存储了盐。

我有一个测试用户,其密码为"test" ,盐为"salt" 使用MySQL的MD5函数(select md5('testsalt')) ,我发现哈希为"315240c61218a4a861ec949166a85ef0" 我还通过将用户信息发送到我们系统的外部PHP系统的管理员验证了此预期结果。

在系统的一个模块中,我们使用以下代码计算MD5哈希值:

    public static String md5EncryptString(String string, String salt) {
    MessageDigest messageDigest;
    String encryptString = string + salt;
    String result;
    try {
        messageDigest = MessageDigest.getInstance("MD5");
        messageDigest.reset();
        messageDigest.update(encryptString.getBytes(Charset.forName("UTF8")));
        final byte[] resultByte = messageDigest.digest();
        result = new String(Hex.encodeHex(resultByte));
        return result;
    } catch (NoSuchAlgorithmException e) {
        logger.error("NoSuchAlgorithmException in encryptString");
        result = encryptString;
    }
    return result;
}

此方法输出完全相同的md5哈希值。

然后,我在此系统的Spring安全性部分中配置了Md5PasswordEncoder,并遇到了问题,因为它不允许我登录。通过扩展Md5PasswordEncoder类并使用某些日志记录覆盖encodePassword()方法,我能够确定它给定相同的密码("test")和salt ("salt")时,输出不同的md5哈希值:“ 150671e7a5fb8ace58aaa012de7f9b5c”。

谁能解释这个问题,或者给我一些暗示可能是什么原因?

根据Github上的一些消息来源,Spring通过这种方式合并密码和盐:

return password + "{" + salt.toString() + "}";

见方法mergePasswordAndSalt(..)在BasePasswordEncoder.java

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM