密码盐和哈希

本文关键字:哈希 密码 | 更新日期: 2023-09-27 18:02:20

我花了一个小时的时间阅读盐的内容,但仍然不明白它是如何实现的。如果我说错了,请原谅我,但是我认为salting的方式是,存储一个随机字符串的数组列表,例如100个字符串。现在,当用户注册时,一个方法从数组列表中获取一个随机字符串,并检索数组中字符串的索引以插入到我的数据库中,然后将这个随机字符串应用于用户输入的密码,然后将整个字符串散列并存储到数据库中。

现在当用户登录时,它将检索随机字符串的ArrayList索引,然后将其应用于输入的密码,然后对整个字符串进行哈希并比较两个密码。

这是腌制的好方法吗?这算是盐吗?

密码盐和哈希

最好为每个用户/密码散列提供唯一的盐,而不是重复使用有限的100个盐。

原因是因为黑客一旦掌握了一个充满密码的数据库,就会试图破坏它,特别是使用彩虹表来查找多个用户之间共享的已知值。

示例(伪代码):

这很糟糕,因为一旦黑客破解了第一个密码哈希,两个用户都被泄露了。

 //BAD WAY
 var nonUniqueSalt = "some salt value";
 var userPass1 = "P@ssword!";
 var userPass2 = "P@ssword!";
 //Bad! This will be true!
 var isSame = (DoHash(userPass1 + nonUniqueSalt) == DoHash(userPass2 + nonUniqueSalt)); 

这种方法更好,因为即使密码相同,盐也是不同的,所以黑客不能使用彩虹表,并且被迫单独危及每个用户的密码。

 //BETTER WAY
 var uniqueSalt1 = "unique salt 1";
 var userPass1 = "P@ssword!";
 var uniqueSalt2 = "unique salt 2";
 var userPass2 = "P@ssword!";
 //Better! This will be false.
 var isSame = (DoHash(userPass1 + uniqueSalt1) == DoHash(userPass2 + uniqueSalt2)); 

至于一些用户在评论中提到的加盐"算法",你真的不需要太担心它,除了尝试使每个用户的盐唯一(因为上面描述的原因)。

在实践中,无论您使用什么盐,都需要与密码哈希一起存储在数据库中,因此一旦黑客拥有了数据库,无论您如何获得它,他都将拥有您用于盐的值。

因此,使用基于guide . newguid (). tostring()之类的salt就足以为每个登录提供唯一的值。