2

整个密码学的东西让人难以接受,但它真的很有趣,我最近一直在阅读它。

我的问题是关于使用河豚来散列您的密码以进行存储。我知道需要盐,但我不确定该怎么做。我有一些疑问。

  1. 我读过的许多教程,人们似乎只是随机地提出了一个像“oidsjf03”这样的教程,并将它用于他们所有的盐。他们只是捣碎键盘还是什么?

  2. 我也读过很多书说每个密码都应该有一个唯一的哈希值。所以我为我存储的每个密码生成一个单独的盐。然后我必须把它存储在某个地方。然而在哪里?如果我只是将它作为一个条目存储在用户的行中,如果数据库遭到破坏,他们是否可以不只是使用该盐生成彩虹表?

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

  3. 为什么为每个用户拥有一个独特的如此重要?假设您正在使用河豚,并且您的数据库遭到破坏,并且您的盐也被捕获。黑客可以创建一个彩虹表来测试您的密码,但是如果对哈希进行大量轮次,例如,每个密码可能需要 0.1 秒。如果他们想创建一个包含 10 亿个条目的彩虹表,那么创建它需要 1 亿秒(或大约 3 年)。

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

  4. 你如何为哈希生成这个盐?PHP 的uniqid()功能是否足够,还是我应该做一些花哨的事情?

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

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

4

2 回答 2

4

1- 我读过的许多教程,人们似乎只是随机地提出了一个像“oidsjf03”这样的教程,并将其用于他们所有的盐。他们只是捣碎键盘还是什么?

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

2-我也读过很多书说每个密码都应该有一个唯一的哈希值。所以我为我存储的每个密码生成一个单独的盐。然后我必须把它存储在某个地方。然而在哪里?如果我只是将它作为一个条目存储在用户的行中,如果数据库遭到破坏,他们是否可以不只是使用该盐生成彩虹表?

盐是哈希的一部分。只有当您有多个使用相同盐的用户时,彩虹表才有效。但它们都是独一无二的,对吧?因此,将其与哈希一起存储就可以了。#3 也是如此。

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

自 PHP 5.5 起,密码散列函数已直接内置于 PHP 中。同时,请参阅上述链接,评论中是指向与这些功能前向兼容且适用于 PHP >= 5.3.7 的 Github 项目的链接。

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

内置的 PHP 函数更好,因为一旦发现任何安全漏洞,它们将始终保持最新状态。我会改用它们。然而 phpass 是一个很好的选择。

于 2013-02-20T23:25:15.207 回答
0

除了上述答案之外,您还可以在 DB 中使用哈希值保存盐,因为如果您的数据库受到攻击,攻击者需要知道您的盐算法。像 hash($pass.$salt) 或 hash(hash($pass).$salt) 等。

于 2013-02-20T23:37:20.903 回答