2013-01-14 76 views
2

我正在使用SimpleMembershipProvider作为我的数据库提供者。SimpleMembershipProvider - 密码加密

我已经增加了新的功能来通过继承来改进这个提供者。

现在我想创建一个像“ChangeEmail”这样的函数,但在此之前检查输入的密码是否正确。

所以我必须加密输入的密码,并将结果与​​我的数据库中的条目进行比较。

的问题是:

以何种方式SimpleMembershipProvider加密密码?

我想:

Crypto.HashPassword(currentPassword); 

结果是相似的,但不是在数据库中的相同这样的。

PasswordFormat属性设置为MembershipPasswordFormat.Hashed。经由Crypto.HashPassword

AIYlAKcmDaABMw1PVx1kheZq2KXkhVs4QjO7MnwfHPcTBjnmRobRqJzWYHYO/S4T7w== 

这:

例如,哈希值“123456”,而产生登记

AG+md+0W2EuV9BzUdohkYMK547jB5ochvxeVKYQTkls0UQ+3W0BWPHnFoffiIn2byw== 

它看起来像相同类型的编码,但为什么结果是不同的?

+0

你对['PasswordFormat'](http://msdn.microsoft.com/en-us/library/system.web.security.membershipprovider.passwordformat.aspx)属性设置了什么?这决定了密码的存储方式。 – adrianbanks

+0

@adrianbanks MembershipPasswordFormat.Hashed – Never

+1

如果'Crypto.HashPassword'不完全吸引,它将在每次调用时返回不同的密码。 – CodesInChaos

回答

6

Crypto.HashPassword为每个调用产生一个新盐,所以每次输出都会有所不同。验证使用Crypto.VerifyHashedPassword

或者直接使用Rfc2898DeriveBytes。这使您可以调整散列成本,并且可以避免使用大于本地大小(20字节)的散列。