Php 我应该将盐和哈希密码一起存储在数据库中吗?

Php 我应该将盐和哈希密码一起存储在数据库中吗?,php,security,hash,md5,salt,Php,Security,Hash,Md5,Salt,我一直在读一大堆关于安全性的东西,我现在才开始尝试使用这些代码。我想使用MD5加密和salt。我在random salt中遇到了这个漂亮的PHP脚本: substr(str_shuffle(str_repeat('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',5)),0,10); 它随机生成一些字符作为salt,但我在想:我该如何检查登录?我是移除盐,还是将其存储在数据库中?将其存储在数据库中。否则,您无法将用户

我一直在读一大堆关于安全性的东西,我现在才开始尝试使用这些代码。我想使用MD5加密和salt。我在random salt中遇到了这个漂亮的PHP脚本:

substr(str_shuffle(str_repeat('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',5)),0,10);

它随机生成一些字符作为salt,但我在想:我该如何检查登录?我是移除盐,还是将其存储在数据库中?

将其存储在数据库中。否则,您无法将用户提供的密码与散列密码进行比较


有些人甚至在给定用户每次成功登录时重新生成哈希(使用新的salt),尽管下面的评论员认为这不是最好的主意(请参见评论员)

将其存储在数据库中。否则,您无法将用户提供的密码与散列密码进行比较


有些人甚至在给定用户每次成功登录时重新生成哈希(使用新的salt),尽管下面的评论员认为这不是最好的主意(请参阅评语)

您不应该使用MD5进行密码哈希。看


为了回答您最初的问题,salt与散列密码一起存储在数据库中。如果发现散列密码,salt并不意味着是秘密的。其目的是防止攻击者使用rainbow表。

您不应该使用MD5进行密码哈希。看


为了回答您最初的问题,salt与散列密码一起存储在数据库中。如果发现散列密码,salt并不意味着是秘密的。其目的是防止攻击者使用rainbow表。

您必须将其存储在数据库中,否则将无法与之进行比较。使用salt时要记住的是,复杂性可能会有所不同,在不知道salt是什么的情况下,它被野蛮强迫黑客攻击的可能性会大大降低

例如:

$password = "banana";
$salt = "a12dsfg33B1cD2eF3G"; # Can be any assortment of characters
$password = md5($salt.$password);

然后,您只需附加相同的salt(必须匹配才能工作),并将相同的函数传递给您的登录脚本,该脚本结合了salt和提供的密码。然后将其与数据库中的值进行检查,以验证用户身份。

您必须将其存储在数据库中,否则将无法与之进行比较。使用salt时要记住的是,复杂性可能会有所不同,在不知道salt是什么的情况下,它被野蛮强迫黑客攻击的可能性会大大降低

例如:

$password = "banana";
$salt = "a12dsfg33B1cD2eF3G"; # Can be any assortment of characters
$password = md5($salt.$password);

然后,您只需附加相同的salt(必须匹配才能工作),并将相同的函数传递给您的登录脚本,该脚本结合了salt和提供的密码。然后将其检查到数据库中的值以对用户进行身份验证。

好的,所以salt用于单向散列和加密。它们使得反转加密或散列变得更加困难。我认为用散列来指出这一点比较容易,所以我将从这一角度来写,但这些原则通常适用于加密

假设您正在保存密码。您的一个用户选择“kiwi”作为密码。因为用纯文本存储密码是愚蠢的,所以你不想这样做。你想要散列密码

但是,那些讨厌的黑客已经编译了庞大的散列查找表数据库。(看一个!)

那么,我们如何挫败黑客呢?通过盐析用户的输入!salt是一个随机字符串(或者说是一组比特),它通过加密方式与用户的输入相结合,以生成更安全的散列

例如,如果要散列的字符串仍然是“kiwi”,而我们的salt是“5m3d”,那么一个简单的salt机制可能会将这两个字符串连接成“kiwi5m3d”。黑客的数据库中可能有“kiwi”,但可能没有“kiwi5m3d”。一个好的腌制系统可能会执行比这复杂得多的功能

所以现在黑客需要一个新的查找数据库来查找每种可能的盐。使用随机salt意味着黑客将不得不进行完全的暴力攻击,而不是重复使用以前的计算或使用其他人的查找表

你可以为每件事选择不同的盐,或者为你网站上的每件事选择相同的盐。每个实体的不同salt需要对每个实体进行新的暴力攻击,但这会使实现更加困难,因为每个salt必须保存,而不是有一个全局salt(对于已经有些随机的数据,例如密码,这应该足够了)

在加密的情况下,仍然可以使用查找表,但要加密的数据通常变化很大,因此不可行。所以它变成了一个玩“猜密码”的游戏。“猕猴桃”很容易猜,而“猕猴桃3D”很难猜

你必须把盐保存在某个地方,因为这是“知道”什么被散列或加密的唯一方法。在散列的情况下,您将用户的原始散列与其输入的盐渍散列进行比较。在加密的情况下,您需要salt来解密数据

你将从这里走向何方? 首先,不要使用MD5。我在上面给了你一个MD5查找数据库的链接。该功能越来越被认为是薄弱的。sha类算法是更好的选择

第二,一定要选择好的盐。时间越长,随机化效果越好。计算机不善于生成随机数据。该网站可能是一个很好的选择,它对如何生成随机数有很好的分解


<P>第三,考虑盐算法。简单的连接应该可以工作,但是HMAC(我不太了解的东西)可能会更好。

好的,所以盐用于单向散列和加密。它们使得反转加密或散列变得更加困难。我认为用散列来指出这一点比较容易,所以我将从这一角度来写,但这些原则通常适用于加密

假设您正在保存密码。你的一个用户选择了这个词