【问题标题】:Java Sha-512 Message Digest with salting not matching linux shadow file hashed passwordsJava Sha-512 带有加盐的消息摘要与 linux 影子文件散列密码不匹配
【发布时间】:2016-08-07 17:14:48
【问题描述】:

我正在尝试使用 MessageDigest 生成与在 linux shadow 文件中找到的相同的哈希,给定密码、盐值和哈希算法,尽管结果与我从下面的函数中得到的不匹配。

  • 哈希算法 = 6
  • 密码 = mandar
  • 盐值 = 5H0QpwprRiJQR19Y
  • 预期输出 = $6$5H0QpwprRiJQR19Y$bXGOh7dIfOWpUb/Tuqr7yQVCqL3UkrJns9.7msfvMg4ZOPsFC5Tbt32PXAw9qRFEBs1254aLimFeNM8YsYOv。

  • 实际输出 = ca0d04319f273d36f246975a4f9c71d0184c4ca7f3ba54bc0b3e0b4106f0eefca1e9a122a536fb17273b1077367bf68365c10fa8a8a2b1828518a>498a>

我有这个生成哈希值的函数

public String getSha512Hash(String password, String saltValue) throws NoSuchAlgorithmException{
    String text = saltValue + password ;
    MessageDigest messageDigest = MessageDigest.getInstance("SHA-512");
    byte[] bytes = messageDigest.digest( text.getBytes() );
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < bytes.length; ++i) {
        sb.append(Integer.toHexString((bytes[i] & 0xFF) | 0x100).substring(1,3));
    }
    return sb.toString();
}

我指的是this网站。

【问题讨论】:

  • 您在比较两个不同的东西:“预期输出”是一个字符串,包括哈希算法、盐和 base 64 编码中的哈希,“实际输出”是 base 中的哈希16(十六进制)编码。
  • 另请注意,您正在假设 1) 盐的位置(如果它不包括任何额外的东西)和 2) SHA-512 只应用一次(而不是在类似的迭代在密码哈希函数中很常见。

标签: java linux sha512


【解决方案1】:

/etc/shadow 中的密码使用crypt(3) 系统调用 (man crypt) 进行哈希处理。

您可以使用Apache Commons implementation,它应该模仿相同的行为。

【讨论】:

    【解决方案2】:

    根本问题是您所指的站点使用 Perl 的 crypt(),这似乎是对 libc crypt() 的直接调用。在the manual of crypt 中未指定实际计算SHA-512 哈希的方式,但我搜索了GitHub 并找到了this ~400 LOC source file sha512-crypt.c

    我通读了它,但不知道它是否引用了某个标准,或者它是否是唯一使用该算法的程序。由于 SHA-512 似乎也是 POSIX 标准的专有扩展,所以这绝对不是不可能的。

    您可以询问维护者或邮件列表并报告您的发现,否则如果您绝对需要该功能,您可以编写一个原生扩展(不知道是否有可用的 Java 库)。

    【讨论】:

      猜你喜欢
      • 2014-05-12
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      • 2015-05-27
      • 2020-01-11
      • 2017-09-26
      • 2011-09-08
      相关资源
      最近更新 更多