2011-08-09 59 views
0

我正在使用Jquery SHA512.js发送加密并发送用户名和密码到服务器。 在服务器上,我正在执行以下操作来创建我的DB存储的HASH:SHA加密 - 是否真的需要盐?

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

这一切工作正常。

我的问题是盐的价值是什么? 在Salt应用于密码的时候,密码已经在服务器上,而不是在Internet上传输。 Salt也存储在密码哈希旁边。

因此它似乎有人需要得到我的哈希的表,如果他们这么做,他们也可以得到盐和我的代码的休息和做他们想要与我在一般的网站是什么。

我可以看到其良好的应用盐和我会做,但它仅发生在服务器上,而不是从浏览器向服务器我怀疑它的价值。我错过了什么吗?

另外一个问题 - 是它可以从浏览器向服务器申请盐。我假设没有,或者至少如果你这样做了,如果有人检查了源代码(例如:在我的原因在jquery中可见),将是可见的。因此没有真正的价值。

THX

回答

4

盐的要点是使其更难,看看2人的密码是相同的。关于SHA的一件事是它不容易逆转。大多数攻击都涉及为常见密码生成散列,因此对于相当复杂的密码来说,它变得更难,特别是盐(有些人使用用户名作为盐,其他人使用随机生成的数字)。通常你想在服务器端代码上做到这一点(我不认为在浏览器代码上安全)。你也不应该将实际的密码存储在你只存储散列的服务器上(如果你还不知道它,也许是盐)

再次看一看,我看到你在使用2个散列之后其他256和512.这是一个坏主意,使用一个并坚持下去。您浪费时间计算多个哈希值。

+0

我+1你的答案为第一段。第二段可能在未来是错误的。看到我的评论马克B. –

+0

@马克,是的,我真的读了几个星期后,这个文件相当有趣。尽管有散列哈希的技术,但它具有这种效果,可以更容易地找到原始字符串。我有另一篇文章显示这个地方,但我现在似乎无法找到它。 –

2

这样的混合哈希值是毫无意义。采用sha512散列并通过sha256运行它必然会将密钥空间减半,所以你所做的只是浪费了cpu时间,使碰撞几率加倍。这个可能性仍然是微不足道的,但仍然需要考虑。

的盐是有作为对接覆盖机制。如果由于某种原因你的数据库泄露了(例如转储文件被“丢失”),那么生成一个sha256/512常见密码彩虹表并查看桌面上是否有任何点击将是微不足道的。散列在那里使生成彩虹表的花费更加昂贵。例如“密码”很容易散列和检查。 “密码#^ $ @#%#^ Y#@#$ @#^%$^Y %% $”不太可能被彩虹遮挡。

+0

使用盐也可以保护您从哈希中恢复常用密码......例如[谷歌搜索“hello”的md5哈希值(http://www.google.co.uk/search?sourceid=chrome&ie = UTF-8&q = 5d41402abc4b2a76b9719d911017c592) –

+0

@Chris:这是由于彩虹表。 md5本身没有被破坏,因为你可以从一个散列中检索原始字符串,但现在计算/编排冲突以找到一个散列为相同值的字符串现在相当简单。盐不能防止碰撞,特别是精心策划的。 –

+0

@MarcB - 由于SHA-2的消息扩展功能,通过SHA-2(256)运行SHA-2(512)输出可能会增强对通过线性近似计算碰撞的阻力 - 请参阅Sanadhya和Sarkar以获取参考信息和信息。就所执行的操作而言,SHA-256的复杂性与SHA-512类似 - 例如,小西格玛-1函数具有3次旋转和XORd移位。 SHA-512没有例如6次旋转和2次移位,它只是因为SHA-512寄存器较大而具有较大的旋转。 –

0

我不知道你的应用程序,但你不希望只发送用户名/密码来使用SSL服务器和SSL让的公共密钥加密照顾加密为您服务。然后,服务器可以生成一个适当的哈希来存储散列的密码,或者与以前存储的哈希进行比较以进行验证。

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

应该是(无需双散列)

$dbhash = = hash('sha512',$pass + $salt); 

凡通是密码和盐是一些关于用户唯一的(用户ID为例)。如果您选择随机值,则需要使用散列来存储它。