使用我自己的哈希算法而不是流行的哈希算法有什么缺点



我是算法专家,并不那么聪明。但我心里有个问题。有很多哈希算法可用,这些算法可能比我写的复杂10倍,但现在几乎所有的算法都是可以预测的。最近,我读到编写自己的哈希函数不是一个好主意。但为什么呢?我想知道一个程序/程序员如何打破我的逻辑,例如,在5个以上的步骤中为每个字符串创建一个唯一的哈希。假设有人成功地在我的服务器中注入了一个SQL查询,并存储了所有哈希。一个程序(比如hashcat)如何帮助他解密这些散列?在这种情况下,我可以看到我自己的算法的强大一面,它没有人知道,黑客也不知道它是如何实现的。另一方面,众所周知的算法(如sha-1)不再是不可预测的。有一些网站非常有资格有效地打破这些散列。所以,我的简单问题是,为什么聪明人不建议使用自己编写的哈希算法?

默默无闻的安全性可能是一个优势,但你永远不应该依赖它。你依赖的事实是,你的代码是保密的,一旦它被知道(共享托管、备份、源代码管理…),存储的密码很可能不再安全。

即使对密码学家来说,发明一种新的安全算法也是极其困难的。有很多点需要考虑,比如正确的盐析密钥拉伸,确保类似的输出不允许得出关于输入相似性的结论,等等……只有能够承受其他密码学家多年攻击的算法才被视为安全的。

除了发明自己的方案,还有更好的选择。通过发明一种算法,你实际上在散列(你的代码)中添加了一个秘密,只有在知道了这些代码的情况下,攻击者才能开始强行使用密码。添加秘密的更好方法是:

  1. 使用已知的经过验证的算法(BCrypt、SCrypt、PBKDF2)对密码进行哈希
  2. 使用服务器端密钥对生成的哈希进行加密(双向加密)

通过这种方式,您还可以添加一个秘密(服务器端密钥)。只有当攻击者在服务器上拥有特权时,他才能知道密钥,在这种情况下,他也会知道你的算法。该方案还允许在必要时交换密钥,交换哈希算法将更加困难。

最新更新