Как? Шифрование и расшифровка паролей пользователей ASP.NET

мы создаем новый сайт, используя ASP.NET поставщик членства для регистрации пользователя и входа в систему. Наша старая система зашифровала пароли пользователей, чтобы мы могли восстановить их, если понадобится.

У меня есть много проблем, выясняя, можно ли использовать ASP.NET функции членства, чтобы просто зашифровать пароль, когда пользователь регистрируется, а затем расшифровать его, чтобы я мог его видеть.

документация на это ржут несуществующим.

Я знаю, как для настройки Web.config, чтобы он хранил пароли как зашифрованные ala passwordFormat= "зашифровано" в провайдере и присвоение validationKey в machineKey, однако кажется, что пароль все еще хэшируется (хотя, возможно, он просто хорошо зашифрован). В любом случае я не могу расшифровать, как пароль может быть восстановлен (нами), если это необходимо.

спасибо!

4 ответов


хранение паролей в восстанавливаемом формате-очень плохая идея. Если вы можете восстановить их, так может любой, кто врывается в ваш сервер.

вам лучше использовать стандартный подход hash+salt и иметь механизм сброса пароля для обработки случая, когда пользователи забывают свой пароль.


вам нужно использовать passwordFormat= "Encrypted", а не passwordFormat="Hashed". Тогда вы можете использовать DecryptPassword метод MembershipProvider для расшифровки пароля при необходимости.


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

Я предполагаю, что вы используете объекта sqlmembershipprovider что MS поставляет. Если да, то почему бы не использовать встроенные функции вопросов и ответов, чтобы позволить пользователю сбросить свой пароль. В качестве альтернативы (или дополнительно) сбросьте свой пароль для них и напишите им новый. Таким образом, ваше приложение не может случайно предоставить пароль пользователя кому-либо.

Если вам действительно нужно расшифровать их пароли, то passwordFormat должен быть установлен в "зашифрованный". Видеть DecryptPassword для получения информации о расшифровке пароля. Подробнее о том, как настроить расшифровку, см. В разделе PasswordFormat, обратите внимание, что в нем говорится, что вы должны указать атрибут decryptionKey элемента machineKey.