[英]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.