如何?在ASP.NET中加密和解密用户成员密码
我们正在创建一个使用ASP.NET成员资格提供程序进行用户注册和登录的新站点。我们的旧系统加密了用户密码,以便我们可以在需要时对其进行恢复。如何?在ASP.NET中加密和解密用户成员密码
我很难找出是否有可能使用ASP.NET成员资格函数来简单地加密密码,当用户注册,然后解密它,所以我可以看到它。
此文档不存在。
我知道如何将Web.config配置为将密码存储为提供者中的密码ala passwordFormat =“Encrypted”,然后在machineKey中分配一个validationKey,但是好像密码仍然被哈希(尽管也许它只是很好的加密)。无论哪种方式,我无法决定如何在必要时恢复密码(由我们)。
谢谢!
以可恢复的格式存储密码是一个非常糟糕的主意。如果你能恢复它们,那么任何人都可以闯入你的服务器。
你最好使用标准的hash + salt方法并使用密码重置机制来处理用户忘记密码的情况。
您需要使用passwordFormat =“Encrypted”而不是passwordFormat =“Hashed”。然后,您可以使用DecryptPassword method of the MembershipProvider在必要时解密密码。
我假设您使用MS提供的SQLMembershipProvider。如果是这样,那么为什么不使用内置的问题和答案功能来允许用户重置他们的密码。或者(或者另外)重置他们的密码并将新密码发送给他们。这样,您的应用程序无法将意外的用户密码暴露给任何人。
如果您确实需要解密他们的密码,那么passwordFormat必须设置为“Encrypted”。有关解密密码的信息,请参阅DecryptPassword。有关如何配置解密的详细信息,请参阅PasswordFormat,请注意,它表示您必须指定machineKey元素的decryptionKey属性。
我知道DecryptPassword,但我不能让VWD2010将它识别为一种方法。无论我提供的是什么参考或我使用的命名空间。任何想法为什么这是这种情况? – smdrager 2010-06-10 18:46:02
尝试使用System.Web.Security.Membership.Default.DecryptPassword。 DecryptPassword是MembershipProvider类签名的一部分,所以它必须在那里。请注意,System.Web.Security.Membership是一个静态类,它不公开与实现类相同的方法。 – 2010-06-10 18:56:38
Imports System.Web.Security
Public Class PasswordRecovery
Inherits SqlMembershipProvider
Public Function GetDecryptedPassword(ByVal password As String) As String
Try
Dim _encodedPassword() As Byte = Convert.FromBase64String(password)
Dim _bytes() As Byte = DecryptPassword(_encodedPassword)
If _bytes Is Nothing Then
Return ""
Else
Return System.Text.Encoding.Unicode.GetString(_bytes, &H10, _bytes.Length - &H10)
End If
Catch ex As Exception
Throw New Exception("Error decrypting password.", ex)
End Try
End Function
End Class
这是一种可能性。如果帐户信息出来,这将是非常糟糕的公关。 – smdrager 2010-06-10 18:46:45
默认情况下ASP.NET成员资格提供程序是否支持加密密码?这意味着密码以散列文本形式传输并以散列格式存储在数据库中。你需要更多吗? – ryancrawcour 2012-02-07 05:27:19
为了澄清,ASP.NET成员身份支持清除,散列和加密格式。散列是默认值,只有一种方法(在大多数情况下最好)。加密允许解密密码。 – pdavis 2012-10-25 14:43:59