MD5编码具有不同的结果

Mat*_*son -1 java security spring md5

我遇到了MD5编码这个奇怪的问题.实际上,在每个人都跳进来告诉我不要使用MD5之前:它是一个遗留系统,并且已经选择了算法.

无论如何 - 我有一个存储MySQLMD5哈希密码的表.在同一张表中,盐也被储存.

我有一个测试用户,密码是"test",盐是"salt".使用MySQLs 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;
}
Run Code Online (Sandbox Code Playgroud)

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

然后我在这个系统的Spring安全部分配置了一个Md5PasswordEncoder并遇到问题,因为它不会让我登录.通过扩展Md5PasswordEncoder类并使用一些日志记录覆盖encodePassword()方法,我能够确定它输出一个不同的md5哈希:"150671e7a5fb8ace58aaa012de7f9b5c"给出相同的密码("test")和盐("salt").

任何人都可以解释这个或给我一些暗示可能导致这种情况的原因吗?

Rob*_*ert 6

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

return password + "{" + salt.toString() + "}";
Run Code Online (Sandbox Code Playgroud)

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