Javascript中的PBKDF2安全性

Javascript中的PBKDF2安全性,javascript,password-encryption,pbkdf2,Javascript,Password Encryption,Pbkdf2,在PBKDF2中,salt对于每个passwort都应该是唯一的,因此使用相同密码的两个用户将得到两个不同的哈希值 我对salt的想法是用户名和密码的SHA1散列,因此它对于每个用户都是唯一的 实际上,我必须在JavaScript环境中生成PBKDF2哈希。显示salt是如何生成的,因为JavaScript源是纯文本的吗?使用用户名作为salt基本上是令人满意的,但不能抵御多种攻击场景。例如,可以在使用相同算法的两个网站的数据库中比较密码。此外,可以提前生成彩虹表,从而缩短折衷后的开裂时间。 出

在PBKDF2中,salt对于每个passwort都应该是唯一的,因此使用相同密码的两个用户将得到两个不同的哈希值

我对salt的想法是用户名和密码的SHA1散列,因此它对于每个用户都是唯一的


实际上,我必须在JavaScript环境中生成PBKDF2哈希。显示salt是如何生成的,因为JavaScript源是纯文本的吗?

使用用户名作为salt基本上是令人满意的,但不能抵御多种攻击场景。例如,可以在使用相同算法的两个网站的数据库中比较密码。此外,可以提前生成彩虹表,从而缩短折衷后的开裂时间。
出于这个确切的原因,应该使用加密PRNG生成salt。如果随机源的源代码是不可预测的,那么攻击者可以看到随机源的源代码本身并不是问题。请参阅以了解如何使用javascript生成它。

简单地使用随机盐有什么错?除了你的方法不需要用散列密码存储盐之外,我想不出有什么好处

用户名和密码的散列连接在一起应该可以。由于密码是秘密的,用户名和密码的哈希值将是不可预测的。然而,正如其他人所提到的,如果有两个网站使用相同的算法,并且使用这些网站的人对这两个网站使用相同的凭据,则可能存在安全问题(即,查看他们的哈希密码,我们可以看出他们对每个网站使用相同的密码)。添加站点的域应该可以解决这个问题。例如(+是串联):


salt=散列(域+用户名+密码)


综上所述,我强烈建议使用加密随机数生成器生成salt,因为这是生成salt的标准做法。

彩虹表仅对非salt密码有效。如果salt是每个用户唯一的,那么rainbow表将必须每个用户生成,这完全违背了rainbow表的观点;一旦你把手放在散列上,那么破解它就会更快。(但你说得对,这是一个针对每个用户的表,这不太方便)