2015-07-10 114 views
-1

我花了过去一小时的腌制阅读起来还是不明白它是如何实现的。请原谅我,如果我错了,但我想腌制的方式是,存储随机字符串的ArrayList,例如100个字符串。现在,当用户注册,一个方法从数组列表一个随机字符串,并检索数组中的字符串的索引插入到我的数据库,它那么这个随机字符串适用于用户输入的密码,然后散列整个字符串并存储到数据库中。密码salting和哈希asp.net?

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

这是一种很好的腌制方法吗?这是否被归类为腌制?

+3

不要试图去创造你自己的。查找现有的算法。 – DLeh

+0

@DLeh发明我自己的失败是什么? – mogorilla

+3

你为什么认为有整个专业设计安全措施?如果您在理解时遇到困难,您认为有什么机会可以在没有安全漏洞的情况下完美实现它?安全工程师为此谋生,并且仍然把它搞乱了很多。 – DLeh

回答

1

最好为每个用户/密码散列设置独特的盐,而不是重复使用有限的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()的盐就足以让每个登录都拥有唯一的值。