在PHP中使用blowfish存储密码

时间:2013-02-20 23:13:20

标签: php mysql hash passwords blowfish

这整个密码学的东西很多东西可以吞下去,但它真的很有趣,我最近一直在阅读它。

我的问题是关于使用blowfish哈希密码进行存储。我知道需要盐,但我不确定该怎么做。我有一些问题。

  1. 很多教程我读过的人似乎随机想出了一个像“oidsjf03”的教程,并将它用于所有的盐。他们只是捣乱他们的键盘或什么?

  2. 我还阅读了很多说每个密码应该有一个唯一的哈希值。所以我为我存储的每个密码生成一个单独的salt。然后我必须把它存放在某个地方。然而呢?如果我只是将它作为条目存储在用户的行中,如果数据库被泄露,那么它们是否只能生成带有该盐的彩虹表?

    我说这不可行是正确的,因为他们需要为每个密码生成一个彩虹表,并且使用河豚创建每个哈希需要一段时间,所以这不实用吗?

  3. 为什么每个用户都有一个独特的如此重要?假设你正在使用河豚,你的数据库受到了损害,你的盐也会被捕获。黑客可以创建一个彩虹表来测试你的密码,但是如果哈希上有大量的轮次,那么每个密码可能需要0.1秒。如果他们想要创建一个包含10亿个条目的彩虹表,创建它的时间为1亿秒(或大约3年)。

    如果您使用了独特的盐并且说了1000个密码,他们必须创建1000个彩虹表,将时间增加到3000年。这是为什么?每个密码存储的时间量是多少?

  4. 如何为哈希生成此salt? PHP的uniqid()功能是否足够,或者我应该做一些花哨的东西?

  5. 我真的需要创建一个完整的课程等,还是可以创建一个简单的函数?

  6. 最后,我听说phpass提到了很多安全问题以及用户应该如何使用它而不是自己犯错误。这真的是推荐的做法吗?

2 个答案:

答案 0 :(得分:4)

  

1-很多教程我读过的人似乎随机想出了一个像#34; oidsjf03"并将它用于所有的盐。他们只是捣乱他们的键盘或什么?

对所有东西使用相同的盐是一个坏主意。周期。

  

2-我也读了很多,说每个密码应该有一个唯一的哈希。所以我为我存储的每个密码生成一个单独的salt。然后我必须把它存放在某个地方。然而呢?如果我只是将它作为条目存储在用户的行中,如果数据库被泄露了,那么它们是不是只能生成带有该盐的彩虹表?

salt是哈希的一部分。只有当多个用户使用相同的盐时,彩虹表才有效。但它们都是独一无二的,对吧?所以用散列存储它很好。同样适用于#3。

  

4-如何为哈希生成这个盐? PHP的uniqid()功能是否足够,或者我应该做一些花哨的东西?

从PHP 5.5开始,password hashing functions已直接构建到PHP中。在此期间,请参阅上述链接,并在注释中指向Github项目的链接,该项目向前兼容这些功能,可用于PHP> = 5.3.7。

  

6-最后,我听说phpass提到了很多安全性以及用户应该如何使用它而不是自己犯错误。这真的是推荐的做法吗?

内置的PHP函数更好,因为如果知道任何安全漏洞,它们将始终保持最新。我会改用它们。然而,phpass是一个非常好的选择。

答案 1 :(得分:0)

除了上面的答案,如果您的数据库受到损害,您可以在数据库中保存带有哈希值的盐,并且需要知道您的盐算法。像hash($ pass。$ salt)或hash(hash($ pass)。$ salt)等。