我们正在使用ASP.NET成员资格提供程序创建一个用于注册和登录的新站点。我们的旧系统加密了用户密码,以便我们可以在需要时恢复它们。
我在查找是否可以使用ASP.NET成员资格功能在用户注册时简单地加密密码然后解密它以便我可以看到它时,我遇到了很多麻烦。
这方面的文档几乎不存在。
我知道如何配置Web.config以将密码存储为加密的ala 提供程序中的passwordFormat =“Encrypted”并在machineKey中分配validationKey,但是密码似乎仍然被哈希(尽管它可能只是加密了)。无论哪种方式,我都无法决定如何在必要时恢复密码(由我们)。
谢谢!
答案 0 :(得分:10)
以可恢复的格式存储密码是一个非常糟糕的主意。如果您可以恢复它们,那么任何闯入您服务器的人都可以。
最好使用标准的hash + salt方法并使用密码重置机制来处理用户忘记密码的情况。
答案 1 :(得分:5)
您需要使用passwordFormat =“Encrypted”而不是passwordFormat =“Hashed”。然后,您可以在必要时使用DecryptPassword method of the MembershipProvider解密密码。
答案 2 :(得分:1)
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
答案 3 :(得分:0)
我假设您使用的是MS提供的SQLMembershipProvider。如果是,那么为什么不使用内置的问答功能来允许用户重置密码。或者(或另外)重置他们的密码并通过电子邮件将新密码发送给他们。这样,您的应用就无法意外地向任何人公开用户密码。
如果您确实需要解密密码,则必须将passwordFormat设置为“Encrypted”。有关解密密码的信息,请参阅DecryptPassword。有关如何配置解密的详细信息,请参阅PasswordFormat,请注意它必须指定machineKey元素的decryptionKey属性。