代码之家  ›  专栏  ›  技术社区  ›  smdrager

怎样?在ASP.NET中加密和解密用户成员身份密码

  •  8
  • smdrager  · 技术社区  · 15 年前

    我们正在使用ASP.NET成员资格提供程序创建一个新网站,用于用户注册和登录。我们的旧系统加密了用户密码,这样我们可以在需要时恢复它们。

    我很难确定是否可以在用户注册时使用ASP.NET成员资格函数简单地加密密码,然后对其进行解密,这样我就能看到它。

    这方面的文件几乎不存在。

    我知道如何配置web.config使其将密码存储为加密的ala passwordFormat=“encrypted”在提供程序中,并在machinekey中分配一个validationkey,但是似乎密码仍然会被散列(尽管可能只是很好地加密)。不管怎样,如果必要的话,我都无法决定如何恢复密码。

    谢谢!

    4 回复  |  直到 14 年前
        1
  •  10
  •   frankodwyer    15 年前

    以可恢复格式存储密码是一个非常糟糕的主意。如果你能恢复它们,任何闯入你服务器的人都能恢复。

    最好使用标准的hash+salt方法,并使用密码重置机制来处理用户忘记密码的情况。

        2
  •  5
  •   John Bledsoe    15 年前

    您需要使用passwordFormat=“encrypted”而不是passwordFormat=“hashed”。然后你可以使用 DecryptPassword method of the MembershipProvider 必要时解密密码。

        3
  •  1
  •   Justin    14 年前
    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
    
        4
  •  0
  •   Ken Henderson    15 年前

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

    如果您真的需要解密他们的密码,那么密码格式必须设置为“加密”。见 DecryptPassword 有关解密密码的信息。有关如何配置解密的详细信息,请参阅 PasswordFormat 注意,它指出必须指定machinekey元素的decryptionkey属性。

    推荐文章