最好为每个用户/密码散列设置独特的盐,而不是重复使用有限的100种盐。
原因是因为黑客试图破解数据库中充满密码的方式,特别是使用彩虹表来查找多个用户共享的已知值。
例如(伪代码):
这是不好的,因为一旦黑客破解第一密码散列,两个用户都受到损害。
//BAD WAY
var nonUniqueSalt = "some salt value";
var userPass1 = "[email protected]!";
var userPass2 = "[email protected]!";
//Bad! This will be true!
var isSame = (DoHash(userPass1 + nonUniqueSalt) == DoHash(userPass2 + nonUniqueSalt));
这种方式是更好的,因为盐是即使密码是相同的不同,所以黑客不能使用彩虹表,被迫妥协单独每个用户的密码。
//BETTER WAY
var uniqueSalt1 = "unique salt 1";
var userPass1 = "[email protected]!";
var uniqueSalt2 = "unique salt 2";
var userPass2 = "[email protected]!";
//Better! This will be false.
var isSame = (DoHash(userPass1 + uniqueSalt1) == DoHash(userPass2 + uniqueSalt2));
至于盐析“算法”在评论中提到某些用户来说,你并不真的需要从试图让唯一的每个用户的盐(担心它过于一边的,因为上述原因以上)。
在实践中,无论食盐,使用将需要存储在数据库旁边的密码哈希值,因此,一旦黑客拥有了数据库,他将让你用于盐无论你如何去获得价值它。因此,使用基于类似Guid.NewGuid()。ToString()的盐就足以让每个登录都拥有唯一的值。
不要试图去创造你自己的。查找现有的算法。 – DLeh
@DLeh发明我自己的失败是什么? – mogorilla
你为什么认为有整个专业设计安全措施?如果您在理解时遇到困难,您认为有什么机会可以在没有安全漏洞的情况下完美实现它?安全工程师为此谋生,并且仍然把它搞乱了很多。 – DLeh