整个密码学的东西让人难以接受,但它真的很有趣,我最近一直在阅读它。
我的问题是关于使用河豚来散列您的密码以进行存储。我知道需要盐,但我不确定该怎么做。我有一些疑问。
我读过的许多教程,人们似乎只是随机地提出了一个像“oidsjf03”这样的教程,并将它用于他们所有的盐。他们只是捣碎键盘还是什么?
我也读过很多书说每个密码都应该有一个唯一的哈希值。所以我为我存储的每个密码生成一个单独的盐。然后我必须把它存储在某个地方。然而在哪里?如果我只是将它作为一个条目存储在用户的行中,如果数据库遭到破坏,他们是否可以不只是使用该盐生成彩虹表?
我是否正确地说这是不可行的,因为他们需要为每个密码生成一个彩虹表,并且使用河豚创建每个哈希需要一段时间,所以这不实用吗?
为什么为每个用户拥有一个独特的如此重要?假设您正在使用河豚,并且您的数据库遭到破坏,并且您的盐也被捕获。黑客可以创建一个彩虹表来测试您的密码,但是如果对哈希进行大量轮次,例如,每个密码可能需要 0.1 秒。如果他们想创建一个包含 10 亿个条目的彩虹表,那么创建它需要 1 亿秒(或大约 3 年)。
如果你使用独特的盐并且有 1000 个密码,他们必须创建 1000 个彩虹表,将时间增加到 3000 年。这是为什么?每个存储密码的时间会增加吗?
你如何为哈希生成这个盐?PHP 的
uniqid()
功能是否足够,还是我应该做一些花哨的事情?我真的需要创建一个完整的类等,还是可以创建一个简单的函数?
最后,我听说 phpass 提到了很多关于它的安全性以及用户应该如何使用它而不是自己可能犯错误。这真的是推荐的做法吗?