【问题标题】:MD5 encoding with different results不同结果的MD5编码
【发布时间】: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 :) 这当然不是很高的迭代次数。

标签: java spring security md5


【解决方案1】:

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

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

请参阅BasePasswordEncoder.java 中的方法 mergePasswordAndSalt(..)

【讨论】:

  • 你可以找到方法here
  • 是的:$ echo -n 'test{salt}'|md5sum 返回150671e7a5fb8ace58aaa012de7f9b5c *-
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 2020-03-17
  • 1970-01-01
  • 2020-02-14
  • 2019-10-04
  • 1970-01-01
相关资源
最近更新 更多