【发布时间】:2014-08-14 15:39:48
【问题描述】:
我在MD5 编码中遇到了这个奇怪的问题。实际上,在大家跳出来告诉我不要使用 MD5 之前:它是一个遗留系统,并且已经选择了算法。
无论如何 - 我有一个 MySQL 表,其中存储了 MD5 哈希密码。在同一个表中,盐也被存储。
我有一个测试用户,他的密码是"test",salt 是"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;
}
此方法输出完全相同的 md5 哈希。
然后我在这个系统的 Spring 安全部分中配置了一个 Md5PasswordEncoder 并遇到了问题,因为它不允许我登录。通过扩展 Md5PasswordEncoder 类并使用一些日志记录覆盖 encodePassword() 方法,我能够确定它输出不同的 md5 哈希:“150671e7a5fb8ace58aaa012de7f9b5c”,当给定相同的密码("test") 和盐("salt")。
谁能解释一下或者给我一些可能导致这种情况的提示?
【问题讨论】:
-
相同数量的
iterations? -
如果你要使用 MD5,很好,但是这个“在同一个表中,盐也被存储了。”有点令人担忧。为什么要将盐存储在数据库中?如果您的数据库遭到破坏,那么您的盐就一文不值
-
@19greg96:看起来你还没有理解盐的原因。它只是为了防止对 md5 的彩虹表攻击。
-
您确定无效的方法与其他方法构建相同的输入字符串
"testsalt"? -
@trashgod 迭代次数似乎由您评论的当前投票数回答:1 :) 这当然不是很高的迭代次数。