1

可能重复:
在 PHP 中防止 SQL 注入的最佳方法
隐藏哈希盐的必要性

我对 MySQL 和 PHP 非常陌生,并且在过去几天开始自学,今天我正在研究密码加密等。我一直在浏览许多网页,其中包含有关该主题的信息以及大部分内容他们说要为表中的每个条目生成一个随机盐(据我所知,您不希望每个条目都使用相同的盐),然后该盐应该存储在条目旁边的表中。

据我了解(如果我错了,请纠正我),密码的加密并不能阻止黑客访问它,而只是掩盖了他们确实可以访问数据库的真实值。当然,如果是这种情况,您也不想将盐存储在表中 - 如果黑客访问了数据库并且可以看到加密数据,那么向他展示盐只会让他的解密工作变得更加容易?

4

4 回答 4

3

salt 不用于加密。相反,它(连同密码)进入一个散列函数。这样,没有人(甚至您的应用程序)无法确定密码,但您可以验证密码。

然后使用盐要求攻击者单独攻击每个密码散列(如果攻击者只想要一个密码,则盐没有任何帮助)。多亏了彩虹表,计算普通密码的散列函数的输出相当容易。

salt 值不是秘密的,可以安全地存储在 MySQL 数据库中(甚至发布)。

于 2012-07-29T20:44:56.417 回答
2

salt 的目的是防止使用Rainbow 表。这将允许黑客为某些密码生成大量预先生成的哈希值。通过在散列之前将盐附加到密码,散列与原始密码完全不同。

password => 5f4dcc3b5aa765d61d8327deb882cf99
password+saltvalue => 1d7dc54c316b11f3a38cc24fa68e2b6a

因此他们需要为每个盐值重新创建哈希值,这是不切实际的。

于 2012-07-29T20:45:06.473 回答
2

以您计划的方式储存盐是非常好的。事实上,允许攻击者看到盐是很好的。salt 的目的是通过扩展消息空间的大小来防止人们能够使用称为彩虹表的预构建查找表。盐所做的就是让他们放弃任何预计算并解决整个问题,这很耗时但肯定是可能的(尤其是对于像 md5 这样的哈希——你应该转向 sha256)

您希望为每个用户使用不同的盐,以便攻击者必须为他们恢复的每个密码做全部工作,而不是仅仅基于单个盐生成一个新表。

于 2012-07-29T20:47:40.360 回答
-1

您可以将盐视为“半独特”的东西,它实际上不必是称为盐的附加列。用户名、用户邮箱也是一种盐。所以它们实际上存储在 db 中,在散列密码旁边。当用户决定更改用户名或电子邮件时,会出现这种方法的一个问题。

于 2012-07-29T20:52:59.700 回答