我遇到MD5
编码这个奇怪的问题。实际上,在每个人都跳进去告诉我不要使用MD5之前:它是一个遗留系统并且已经选择了算法。
无论如何 - 我有一个MySQL
表,其中存储了MD5
哈希密码。在同一张表中,盐也被储存。
我有一个测试用户,其密码为"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()方法,我能够确定它输出一个不同的md5哈希:" 150671e7a5fb8ace58aaa012de7f9b5c"如果给出相同的密码("test")
和盐("salt")
。
任何人都可以解释这个或者给我一些暗示可能导致这种情况的原因吗?
答案 0 :(得分:6)
根据Github上的一些消息来源Spring以这种方式合并密码和盐:
return password + "{" + salt.toString() + "}";
中的方法mergePasswordAndSalt(..)