我正在使用Jquery SHA512.js发送加密并向服务器发送用户名和密码。 在服务器上,我正在执行以下操作来创建我的数据库存储HASH:
$ dbhash = = hash('sha256',(hash('sha512',$ user).hash('sha256',$ extremesalt)));
一切正常。
我的问题是什么价值盐? 在将Salt应用于密码时,密码已经在服务器上,而不是通过Internet传输。 Salt也存储在密码哈希旁边。
因此,似乎有人需要使用哈希值来获取我的表格,如果他们这样做,他们也可以获得盐和我的其余代码,并且通常会对我的网站做他们想要的事情。
我可以看到应用盐的好处,我会这样做,但因为它只发生在服务器而不是从浏览器到服务器,我质疑它的价值。我错过了什么吗?
另一个问题 - 是否可以将浏览器中的盐应用到服务器。我假设没有,或者至少如果你这样做,如果检查了源代码就会看到它(例如:我的原因在jquery中可见)。因此没有实际价值。
THX
答案 0 :(得分:4)
盐的目的是让人们更难看出2个人的密码是否相同。关于SHA的一点是它不容易逆转。大多数攻击涉及为常见密码生成哈希值,因此对于相当复杂的密码而言,使用盐变得更加困难(有些人使用用户名作为盐,其他人使用随机生成的数字)。通常你想在服务器端代码上执行此操作(我不认为在浏览器代码上安全)。您也应该永远不会将实际密码存储在您只存储哈希的服务器上(如果您还不知道哈希值,也可以使用盐)
第二次看,我看到你正在使用2个哈希,一个接一个256,然后是512.这是一个坏主意,使用一个并坚持下去。你浪费时间计算多个哈希值。
答案 1 :(得分:2)
像这样混合哈希是毫无意义的。使用sha512哈希并通过sha256运行它必然会将键空间减少一半,所以你所做的就是浪费cpu时间并使碰撞的几率增加一倍。赔率仍然很小/微观,但仍有待考虑。
盐作为对接覆盖机制存在。如果由于某种原因你的数据库泄漏(例如转储文件被“丢失”),生成一个常见密码的sha256 / 512彩虹表并查看你的桌子上是否有任何点击都是微不足道的。哈希是为了使生成彩虹表更加昂贵。例如“密码”很容易哈希并检查。 “密码#^ $ @#%#^ Y#@#$ @#^%$ ^ Y %% $”不太可能被彩虹化。
答案 2 :(得分:0)
我不知道你的应用程序,但你不想只使用SSL将用户名/密码发送到服务器,让SSL的公钥加密为你负责加密。然后,服务器可以生成适当的哈希来存储哈希密码,或者与先前存储的哈希进行比较以进行验证。
答案 3 :(得分:0)
$dbhash = = hash('sha256',(hash('sha512',$user) . hash('sha256',$extremesalt)));
应该(不需要双重哈希)
$dbhash = = hash('sha512',$pass + $salt);
pass是密码,salt是用户唯一的东西(例如userid)。如果您选择随机值,则需要使用哈希值存储它。