密码盐和哈希
本文关键字:哈希 密码 | 更新日期: 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就足以为每个登录提供唯一的值。