Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security 哈希(hash())与盐渍哈希_Security_Hash_Salt_Password Hash - Fatal编程技术网

Security 哈希(hash())与盐渍哈希

Security 哈希(hash())与盐渍哈希,security,hash,salt,password-hash,Security,Hash,Salt,Password Hash,自从引入以来,仅使用哈希密码(e.x:MD5)将密码存储在数据库中是非常困难的 当人们谈论salt散列时,他们总是这样使用它hash(password.salt)甚至hash(hash(password.salt) 我不知道为什么要使用salt,并为每个密码添加额外的条目来存储salt? 为什么我们不直接使用hash(密码)),甚至hash(密码)) 放盐更安全吗?或者仅仅是更复杂的感觉?salt的目的是让字典攻击变得毫无意义。现在,无论您对一个散列进行了多少次重新哈希,相同的输入总是会产生相同

自从引入以来,仅使用哈希密码(e.x:MD5)将密码存储在数据库中是非常困难的

当人们谈论salt散列时,他们总是这样使用它
hash(password.salt)
甚至
hash(hash(password.salt)

我不知道为什么要使用salt,并为每个密码添加额外的条目来存储salt? 为什么我们不直接使用
hash(密码))
,甚至
hash(密码))


放盐更安全吗?或者仅仅是更复杂的感觉?

salt的目的是让字典攻击变得毫无意义。现在,无论您对一个散列进行了多少次重新哈希,相同的输入总是会产生相同的输出散列,因此可以为此构建一个字典。因此,虽然多重哈希可能使暴力攻击变得更加困难,但它对字典攻击没有任何作用。

没有任何东西可以阻止任何人为双重哈希密码构建彩虹表。

salt是一个站点或用户特定的值。 这意味着,为了检索密码,攻击者必须能够访问数据库并知道密码

此外,攻击者还可以生成一次表,然后对多个站点使用它。但是,对于SALT,攻击者必须为每个站点生成一个表,甚至为每个用户生成一个表(使攻击变慢)

特定于站点的盐对网站的安全性几乎没有增加。正如在评论中所说,结合使用站点特定和用户特定的salt,可以比仅使用站点特定的salt显著提高安全性


几年前,我在stackoverflow上问了一个关于密码存储的问题,这可能会对您有所帮助。请参阅。

为了保持简单,让我们假设每个人都使用数字作为密码

如果每个人都使用8位数字作为密码,那么就有100000000种可能。如果你想破坏这个系统,你需要把所有这些可能性都搞乱。如果您有一个“hash of hash of hash”,那么您仍然需要对那些100000000个可能性进行哈希运算——只是用一种稍微复杂一点的方式

现在让我们假设我们也有4位数的盐。现在,不是100000000种可能性,而是10000000000种可能性。。。我们为潜在攻击者提供了10000倍的工作量,而不是3倍的工作量

基本上,可以将salt看作是一种人为地延长每个人的密码长度的方法,从而扩大字典攻击必须处理的空间


编辑:需要澄清的是,考虑到salt也是以纯文本形式提供的,您仍然只有100000000种可能尝试攻击任何一个散列。然而,这意味着,在尝试了一个密码的这些可能性之后,攻击者将没有任何有用的信息来攻击另一个密码。如果没有salt,攻击者可以创建一个100000000个可能的字典,然后知道数据库中的所有密码,只给出它们的哈希值。换句话说,盐有助于防止批量攻击。它们还意味着你不能预先生成字典:为了有效地攻击单个密码,你必须事先知道salt。如果没有salt,您可以在访问散列之前计算每个可能密码的散列。

您可以基于散列字典(散列(pwd))构建彩虹表,所需时间仅为散列(pwd)的两倍(因为性能主要与磁盘写入有关,所以更少),而且不会更大。使用食盐会极大地扩大桌子所需的尺寸,使之达到不切实际的程度


此外(更重要的是),用户通常拥有相同的密码。如果每个用户没有一个单独的salt,那么如果您破坏了一个用户密码,那么您就破坏了拥有相同密码的所有其他用户。

如果您不使用salt,那么攻击者可以构建一个彩虹表,可以用来攻击数据库中的每个密码。多次散列并不能毫无保留地保护您,因为rainbow表的工作方式与您描述的方式完全相同:
hash(hash(password))

如果您为每个用户添加一个随机salt,那么攻击者就不能重复使用同一个表来破解两个密码,因此他们的工作会变得更加困难。另外一个好处是,如果使用salt,两个具有相同密码的用户将散列为不同的值

您迭代散列的想法仍然很好,但是您也需要盐。如果您这样做:

function hashPassword(password, salt) {
    result = hash(salt . password)
    for (i = 0; i < 1000; i++) {
        result = hash(salt . result)
    }
    return result
}
函数hashPassword(密码,salt){
结果=散列(salt.password)
对于(i=0;i<1000;i++){
结果=散列(salt.result)
}
返回结果
}
然后,您使攻击者的工作更加困难1000倍,对合法用户的影响微乎其微。请注意,攻击者每秒可以在一台低端计算机上测试数百万个候选密码—哈希函数设计得非常快。这个1000次迭代循环可以将一个可行的攻击转变为一个需要100年或更长时间的攻击。当计算机在18个月内加速时,只需将迭代次数改为2000次


salt、散列算法和迭代计数不需要保密,可以与计算的散列一起存储在数据库中。您可以选择固定的迭代计数和哈希算法,但必须为每个用户随机生成salt

迭代哈希和使用salt都可以提高密码哈希的安全性。但它们可以抵御完全不同的攻击

迭代散列会增加暴力攻击所需的工作量。但是你不应该像你建议的那样使用一个幼稚的迭代,而应该使用一个为它设计的算法,比如


salt可以防止预先计算的表,因此每个网站和用户的salt应该不同。

我使用一种可比较的方法来散列登录用户的密码。salt(随机值)在会话中生成并发送到clie