【发布时间】:2013-02-06 03:41:08
【问题描述】:
整个密码学的内容令人难以接受,但它真的很有趣,我最近一直在阅读它。
我的问题是关于使用河豚来散列密码以进行存储。我知道需要盐,但我不确定该怎么做。我有一些问题。
我读过的许多教程,人们似乎只是随机地提出了一个像“oidsjf03”这样的教程,并将它用于他们所有的盐。他们只是捣碎键盘还是什么?
-
我也读过很多文章说每个密码都应该有一个唯一的哈希值。所以我为我存储的每个密码生成一个单独的盐。然后我必须把它存储在某个地方。然而在哪里?如果我只是将它作为一个条目存储在用户的行中,如果数据库遭到破坏,他们是否不能只使用该盐生成彩虹表?
我是否正确地说这是不可行的,因为他们需要为每个密码生成一个彩虹表,并且使用河豚创建每个哈希需要一段时间,所以这不实用?
-
为什么为每个用户拥有一个独一无二的用户如此重要?假设您正在使用河豚,并且您的数据库遭到破坏,并且您的盐也被捕获。黑客可以创建一个彩虹表来测试您的密码,但是如果对哈希进行大量轮次,例如,每个密码可能需要 0.1 秒。如果他们想创建一个包含 10 亿个条目的彩虹表,那么创建它需要 1 亿秒(或大约 3 年)。
如果您使用独特的盐并设置 1000 个密码,他们将不得不创建 1000 个彩虹表,将时间增加到 3000 年。这是为什么?每个存储密码的时间会增加吗?
如何为哈希生成这个盐? PHP 的
uniqid()功能够不够,还是我应该做一些花哨的事情?我真的需要创建一个完整的类等,还是可以创建一个简单的函数?
最后,我听说 phpass 提到了很多关于它的安全性以及用户应该如何使用它而不是自己可能会出错。这真的是推荐的做法吗?
【问题讨论】:
-
Re: #3,盐应该对每个用户分开的原因是,如果多个用户使用相同的密码(“secret1”),他们将不会有相同的哈希 - 攻击者可以'不要告诉他们都使用相同的密码,他们将不得不单独破解每个密码。回复:#6,是的。安全的基本规则是,最好使用其他人编写并经过许多其他人测试过的代码,而不是从头开始并重复他们的错误。
标签: php mysql hash passwords blowfish