我使用SimpleMembershipProvider作为我的数据库提供程序。
我已经添加了新功能来通过继承改进此提供程序。
现在我想创建一个像“ChangeEmail”这样的函数,但在此之前检查输入的密码是否正确。
所以我必须加密输入的密码并将结果与我的数据库中的条目进行比较。
问题是:
SimpleMembershipProvider以什么方式加密密码?
我试过了:
Crypto.HashPassword(currentPassword);
结果与数据库中的结果相似但不一样。
PasswordFormat属性设置为MembershipPasswordFormat.Hashed。
例如,注册时生成的“123456”哈希:
AIYlAKcmDaABMw1PVx1kheZq2KXkhVs4QjO7MnwfHPcTBjnmRobRqJzWYHYO/S4T7w==
这是通过Crypto.HashPassword:
AG+md+0W2EuV9BzUdohkYMK547jB5ochvxeVKYQTkls0UQ+3W0BWPHnFoffiIn2byw==
它看起来像是相同类型的编码,但为什么结果不同?
答案 0 :(得分:6)
Crypto.HashPassword
为每个调用生成一个新的salt,因此每次输出都不同。验证使用Crypto.VerifyHashedPassword
。
或者直接使用Rfc2898DeriveBytes
。这允许您调整散列成本,并且可以避免使用大于本机大小(20字节)的散列。