增加散列的计算成本

信息安全 哈希
2021-09-05 04:50:28

这是增加 md5 或 sha1 计算成本的安全方法吗?

public static byte[] increaseHashComplexityMd5(byte[] hash, int loops)
{
    for(int loop = 1; loop <= loops; loop++)
    {
        hash = md5(encryptAes(hash, reverseBits(hash)));
    }
    return hash;
}

public static byte[] increaseHashComplexitySha1(byte[] hash, int loops)
{
    for(int loop = 1; loop <= loops; loop++)
    {
        hash = sha1(encryptAes(hash, reverseBits(hash)));
    }
    return hash;
}
  • reverseBits 反转每个字节的每个位,因此 12345678 90111213 变为 31211109 87654321。
  • encryptAes 通过 hash-with-reversed-bits 加密散列,将产生 16 x 块的结果。
  • md5/sha1 散列给定的字节。

我的目标是让暴力破解哈希变得更加困难。在两个平台(C++ 和 Java)上,我已经有了 hash、aes 和 reverseBits 函数,所以这样的东西是理想的。这会做到吗,还是不安全?

1个回答

不,这不是一种“安全”的方式。这是一个自制的结构,只是将散列函数和对称加密结合在一起,希望得到的混合在某种程度上是强大的。

事实是,在密码散列的特定情况下(与简单散列相反,这是一种非常不同的活动),这种算法的重叠往往会起作用。但是您仍然设法弄错了几件事。即:

  1. 您的系统没有加盐,因此当攻击者必须破解多个密码时,他可以使用并行性和预计算表来优化事物。

  2. 使用多次迭代的目的是使每个密码的尝试代价高昂,但攻击者有资源使用比您的更有效的专用硬件。在这种情况下,MD5 和 AES 都可以在现成的 GPU 上大大加速(对于 AES,使用位切片技术,如在Käsper-Schwabe实现中),从而允许攻击者每美元散列的密码比你多。

阅读此答案以获取有关良好密码散列所需的更多信息。简短的总结是:使用 bcrypt,以及已经可用的库之一。它将比您的创作更强大,并且由于已经完成,因此更易于实施。