有没有办法使用SimpleMembership用于密码的相同散列算法来散列明文密码而无需实际设置或更改密码?我只想要密码的哈希版本进行比较。
我正在使用MVC 4构建一个新站点,并选择使用SimpleMembershipProvider来处理大多数帐户相关数据。我有一个要求是保留密码历史记录。我不需要能够检索实际的密码,因此单向散列很好。
我已经提出了一个解决方案,它使用单独的单向散列算法来保存单独的密码表,但对我来说似乎相当笨拙。如果我可以使用新密码,使用SimpleMembership的算法对其进行哈希处理,将其与我存储的密码进行比较,然后只有在有效的情况下才进行更改,这将更加清晰。当我从旧网站迁移密码时,这也会有所帮助。
现在我能找到生成密码版本的唯一方法是更改密码,然后从SQL读取散列版本。
答案 0 :(得分:3)
SimpleMembershipProvider.SetPassword
(private
方法)使用System.Web.Helpers.Crypto.HashPassword
,因此您可以使用它来散列密码。它还会为您处理盐,它包含在返回值中。
该方法反过来只返回一个RFC 2898哈希,所以你也可以使用System.Security.Cryptography.Rfc2898DeriveBytes
,这是HashPassword
方法使用的.security.cryptography.rfc2898derivebytes.aspx,但是你需要担心腌制。
使用HashPassword
方法应该完全符合您的安全要求;当我被要求执行诸如新密码不匹配任何最后5个的要求时(无论这是否是一个良好的安全要求,它是有效的),我使用这个。您将需要Crypto.VerifyHashedPassword方法来查看输入的密码是否与任何历史密码相匹配,因为这也将为您处理盐。