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

What are the downsides of using my own hashing algorithm instead of popular ones available?

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

默默无闻的安全性可能是一种优势,但您永远不应依赖它。您依赖于您的代码保密这一事实,一旦它为人所知(共享主机、备份、源代码控制……),存储的密码可能不再安全。

发明一种新的安全算法极其困难,即使对于密码学家也是如此。有很多要点需要考虑,比如正确的 saltingkey-stretching,确保相似的输出不允许得出关于相似性的结论输入,等等......只有经得起其他密码学家多年攻击的算法才被认为是安全的。

除了发明自己的方案之外,还有更好的选择。通过发明一种算法,您实际上向散列(您的代码)添加了一个秘密,只有知道此代码,攻击者才能开始暴力破解密码。添加秘密的更好方法是:

  1. 使用已知的经过验证的算法(BCrypt、SCrypt、PBKDF2)散列密码。
  2. 使用服务器端秘密密钥(双向加密)加密生成的散列。

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