Php SHA加密-真的需要盐吗?

Php SHA加密-真的需要盐吗?,php,jquery,sha256,Php,Jquery,Sha256,我使用Jquery SHA512.js发送加密,并向服务器发送用户名和密码。 在服务器上,我正在执行以下操作以创建我的DB存储哈希: $dbhash==hash('sha256',(hash('sha512',$user).hash('sha256',$extremesalt)) 这一切都很好 我的问题是盐有什么价值? 当Salt应用于密码时,密码已经在服务器上,而不是在互联网上传输。此外,Salt存储在密码散列的旁边 因此,似乎有人需要使用散列来获取我的表,如果他们这样做了,他们也可以获取sa

我使用Jquery SHA512.js发送加密,并向服务器发送用户名和密码。 在服务器上,我正在执行以下操作以创建我的DB存储哈希:

$dbhash==hash('sha256',(hash('sha512',$user).hash('sha256',$extremesalt))

这一切都很好

我的问题是盐有什么价值? 当Salt应用于密码时,密码已经在服务器上,而不是在互联网上传输。此外,Salt存储在密码散列的旁边

因此,似乎有人需要使用散列来获取我的表,如果他们这样做了,他们也可以获取salt和我的代码的其余部分,并对我的站点执行他们想要的操作

我可以看到应用salt是很好的,我会这么做,但因为它只发生在服务器上,而不是从浏览器到服务器,我怀疑它的价值。我错过什么了吗

还有一个问题-是否可以将salt从浏览器应用到服务器。我假设没有,或者至少如果您这样做了,那么如果您检查了源代码(例如:在jquery中可见的我的原因中),它将是可见的。因此没有真正的价值


thx

盐的作用是让人更难看出两个人的密码是否相同。SHA的一个特点是它不容易逆转。大多数攻击都涉及到为普通密码生成哈希,因此对于相当复杂的密码,它变得更加困难,尤其是使用salt(一些人使用用户名作为salt,其他人使用随机生成的数字)。通常,您希望在服务器端代码上执行此操作(我认为在浏览器代码上执行此操作不安全)。您也不应该在服务器上存储实际密码—您只存储哈希(如果您还不知道,可能还存储salt)


再看一眼,我发现您使用的是2个哈希,一个接一个256,然后是512。这是一个坏主意,使用它并坚持下去。计算多个哈希值会浪费时间。

salt的目的是让你更难判断两个人的密码是否相同。SHA的一个特点是它不容易逆转。大多数攻击都涉及到为普通密码生成哈希,因此对于相当复杂的密码,它变得更加困难,尤其是使用salt(一些人使用用户名作为salt,其他人使用随机生成的数字)。通常,您希望在服务器端代码上执行此操作(我认为在浏览器代码上执行此操作不安全)。您也不应该在服务器上存储实际密码—您只存储哈希(如果您还不知道,可能还存储salt)


再看一眼,我发现您使用的是2个哈希,一个接一个256,然后是512。这是一个坏主意,使用它并坚持下去。计算多个散列会浪费时间。

像那样混合散列是毫无意义的。使用sha512散列并通过sha256运行它必然会将密钥空间减少一半,因此您所做的只是浪费cpu时间并使冲突几率加倍。赔率仍然是微小的/微小的,但它仍然是值得考虑的。


盐是作为一种覆盖屁股的机制存在的。如果由于某种原因您的数据库发生泄漏(例如,转储文件“丢失”),那么生成一个包含常用密码的sha256/512彩虹表并查看表上是否有任何点击就很简单了。散列的存在使得生成彩虹表的成本要高得多。e、 g.“密码”很容易散列和检查。“password#^$@%#^ Y#^ ^ ^ Y%%$”被雨淋的可能性要小得多。

像这样混合哈希是毫无意义的。使用sha512散列并通过sha256运行它必然会将密钥空间减少一半,因此您所做的只是浪费cpu时间并使冲突几率加倍。赔率仍然是微小的/微小的,但它仍然是值得考虑的。


盐是作为一种覆盖屁股的机制存在的。如果由于某种原因您的数据库发生泄漏(例如,转储文件“丢失”),那么生成一个包含常用密码的sha256/512彩虹表并查看表上是否有任何点击就很简单了。散列的存在使得生成彩虹表的成本要高得多。e、 g.“密码”很容易散列和检查。“password#^$$%#^ Y#^ ^ ^ ^ ^ Y%%$”被雨淋的可能性要小得多。

我不知道你的应用程序,但你不想用SSL将用户名/密码发送到服务器,让SSL的公钥加密为你加密吗。然后,服务器可以生成一个适当的散列来存储散列密码或与以前存储的散列进行比较以进行验证。

我不知道您的应用程序,但您不想只使用SSL将用户名/pwd发送到服务器,并让SSL的公钥加密为您进行加密吗。然后,服务器可以生成适当的散列来存储散列密码,或者与先前存储的散列进行比较以进行验证

$dbhash = = hash('sha256',(hash('sha512',$user) . hash('sha256',$extremesalt)));
应该是(不需要双重散列)

其中pass是密码,salt是用户的唯一属性(例如userid)。如果选择随机值,则需要将其与散列一起存储

应该是(不需要双重散列)


其中pass是密码,salt是用户的唯一属性(例如userid)。如果选择随机值,则需要将其与散列一起存储。

使用salt还可以防止您从散列中恢复常用密码。。。举个例子,@Chris:那是因为一张彩虹桌。md5本身并没有因为您可以从散列中检索原始字符串而被破坏,但是现在计算/编排冲突以查找散列到相同值的字符串是相当简单的。salt不能防止冲突,尤其是协调冲突。@MarcB——由于SHA-2的消息扩展功能,通过SHA-2(256)运行SHA-2(512)输出可能会增强通过线性近似计算冲突的抵抗力——有关参考和信息,请参阅Sanadhya和Sarkar。复杂性,,
$dbhash = = hash('sha512',$pass + $salt);