我一直在阅读一些关于安全性的内容,我现在才开始尝试使用代码。我想用盐加MD5加密。我用随机盐跑了这个漂亮的PHP脚本:
substr(str_shuffle(str_repeat('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',5)),0,10);
它随机生成一些字符作为盐,但后来我在想:我将如何检查登录?我是否要删除盐,还是应该将其存储在数据库中?
答案 0 :(得分:6)
您不应该使用MD5进行密码散列。见How can I store my users' passwords safely?
要回答原始问题,盐会与HASHED密码一起存储在数据库中。如果发现散列密码,则盐并不是秘密。其目的是防止攻击者使用彩虹表。
答案 1 :(得分:4)
将其存储在数据库中。否则,您无法将用户提供的密码与散列密码进行比较。
有些人甚至在每次成功登录给定用户后都会重新生成哈希(使用新盐),尽管下面的评论者认为这不是最好的主意(见评论)
答案 2 :(得分:2)
好的,所以盐用于单向散列和加密。它们使得更难以反转加密或哈希。我认为用哈希来表达这一点更容易,所以我会从这个角度来写,但这些原则一般适用于加密。
想象一下,你正在保存密码。您的一位用户选择“kiwi”这个词作为密码。因为以纯文本形式存储密码是愚蠢的,所以您不希望这样做。您想要密码密码。
但是,那些讨厌的黑客已经编译了哈希查找表的巨大的数据库。 (检查this一个!)
那么,我们如何挫败黑客?通过盐化用户的输入! salt是一个随机字符串(或一组位,正确),它与用户的输入密码结合,以产生更安全的哈希值。
例如,如果要散列的字符串仍为“kiwi”且我们的salt为“5m3d”,则简单的salt机制可能会将两者连接成:“kiwi5m3d”。黑客可能在他们的数据库中有“kiwi”,但可能没有“kiwi5m3d”。一个好的腌制系统可能会执行比这更复杂的功能。
现在,黑客需要为每种可能的盐提供一个新的查找数据库。使用随机盐意味着黑客将不得不进行全面暴力攻击,而不是回收以前的计算或使用其他人的查找表。
您可以为所有内容选择不同的盐,或者为您网站上的所有内容选择相同的盐。每个实体的不同盐需要对每个实体进行新的强力攻击,但它可能使实施更加困难,因为必须保存每个盐,而不是有一个全局盐(对于已经有些随机的数据,例如密码,应该足够了。
在加密的情况下,查找表仍然是可能的,但是要加密的数据通常变化到足以使它们不可行。所以它变成了一个玩“猜密码”的游戏。很容易猜到“奇异果”并且难以猜测“kiwi5m3d”。
你 必须在某处保存盐,因为这是“知道”已经散列或加密的唯一方法。在散列的情况下,您将用户的原始散列与其输入的salted散列进行比较。在加密的情况下,您需要salt来解密数据。
你从哪里去? 首先,不要使用MD5。我给了你一个上面的MD5查找数据库的链接。该功能越来越被认为是弱势的。 sha类算法是更好的选择。
其次,确保选择好的盐。更长和更好的randomer。计算机在生成随机数据方面有点不好。 This网站可能是一个不错的选择,并且很好地分析了它如何生成随机数。
第三,考虑盐算法。简单的连接应该可以工作,但也许HMAC(我不太了解的东西)会更好。
答案 3 :(得分:1)
您必须将其存储在数据库中,否则您将无法将其与之进行比较。使用盐时需要记住的是,复杂程度可能会有所不同,而且不知道盐的含量是什么,它是暴力破坏的可能性大大降低了。
示例:
$password = "banana";
$salt = "a12dsfg33B1cD2eF3G"; # Can be any assortment of characters
$password = md5($salt.$password);
然后你只需附加相同的盐(必须匹配工作)并将相同的函数传递给组合salt和提供的密码的登录脚本。然后,您将检查数据库中的值以验证用户身份。
答案 4 :(得分:1)
不要发明自己的密码散列方案,不管它看起来多么漂亮。拥有安全系统很难,因为您无法真正测试安全性。您需要的是以下内容:
这样的事情存在,它被称为bcrypt,您可以使用the portable PHP password hashing framework在PHP中获取它。