如何在ASP.NET中加密和解密用户成员密码

8
我们正在使用ASP.NET会员提供程序创建一个新的网站,用于用户注册和登录。我们的旧系统加密了用户密码,以便在需要时可以恢复它们。
我很难弄清楚是否可能使用ASP.NET会员功能,仅在用户注册时对密码进行加密,然后将其解密以便我可以查看它。
关于此的文档几乎不存在。
我知道如何配置Web.config,使其存储密码为加密格式(例如passwordFormat="Encrypted"),并在machineKey中分配一个validationKey,但似乎密码仍然被散列(尽管可能只是加密得很好)。无论哪种方式,我都无法理解如何在必要时恢复(由我们)密码。
谢谢!
4个回答

10

以可恢复格式存储密码是一个非常糟糕的想法。如果你能够恢复密码,那么任何入侵你的服务器的人也可以。

你最好使用标准的哈希+盐方法,并设置一个密码重置机制来处理用户忘记密码的情况。


这是一种可能性。如果账户信息泄露出去,那将会是非常糟糕的公关问题。 - smdrager
ASP.NET成员资格提供程序默认支持加密密码吗?这意味着密码以散列文本传输并以散列格式存储在数据库中。您还需要更多吗? - ryancrawcour
1
只是为了澄清,ASP.NET成员资格支持开箱即用的明文、哈希和加密格式。哈希是默认设置,仅单向(适用于大多数情况)。加密允许解密密码。 - pdavis

5

您需要使用passwordFormat="Encrypted"而非passwordFormat="Hashed"。然后,您可以在必要时使用MembershipProvider的DecryptPassword方法解密密码


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

Dim _bytes() As Byte = DecryptPassword(_encodedPassword) 出现错误,找不到 DecryptPassword 函数。 - AMH
DecryptPassword MSDN解密密码 MSDN - rob

0

我猜你正在使用微软提供的SQLMembershipProvider。如果是这样,为什么不使用内置的问题和答案功能来允许用户重置密码呢?或者(或者同时)为他们重置密码并将新密码发送到他们的电子邮件中。这样,您的应用程序就不会意外地向任何人公开用户的密码。

如果您真的需要解密他们的密码,则必须将passwordFormat设置为“Encrypted”。请参阅DecryptPassword以获取有关解密密码的信息。有关如何配置解密的详细信息,请参见PasswordFormat,请注意,它说您必须指定machineKey元素的decryptionKey属性。


我知道 DecryptPassword 这个方法,但是我无法让 VWD2010 将其识别为一个方法。无论我提供什么引用或使用哪个命名空间都不行。有任何想法为什么会出现这种情况吗? - smdrager
尝试使用System.Web.Security.Membership.Default.DecryptPassword。DecryptPassword是MembershipProvider类签名的一部分,因此必须存在。请注意,System.Web.Security.Membership是一个静态类,不公开与实现类相同的方法。 - Ken Henderson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接