Расшифровка пароля "Шифрованный" из членства ASP.NET 2.0

У меня есть требование расшифровать пароли Encrypted (не Hashed), расположенные в моей таблице aspnet_Membership. В этой базе данных я вижу поля Password (Шифрованные) и PasswordSalt, и я могу посмотреть на мой web.config, чтобы найти машинный ключ > decryptionKey (validation = "SHA1" decryption = "AES" ).

Примечание: мне бы хотелось использовать пароль Hashed, но по соображениям бизнеса мне нужно иметь возможность использовать пароль для члена, для SSO в и из других удаленных систем, следовательно, используя Encrypted (определенно НЕ используя Clear - yukky! )

Учитывая все это, безусловно, есть способ получить пароль как Clear, простой и читаемый текст, то есть дешифрованный, но у меня возникают реальные проблемы с поиском любого веб-сайта или ответа на stackoverflow (и я смотрю на все "похожие вопросы" и "вопрос с похожими заголовками" здесь), в котором объясняется, как это можно сделать.

Я нашел метод

Ответы

Ответ 1

Создайте класс, который наследуется от SqlMembershipProvider, и в нем вы можете вызвать decrypt.

Весь код, который вам нужен для этого, можно найти в в этой статье Навеена Кохли:

После просмотра кода в отражателе я увидел, что Microsoft провайдеры дешифруют в два этапа. Зашифрованный пароль на самом деле является Base64 преобразование зашифрованных данных. Поэтому сначала он преобразует его из Base64, а затем вызывает метод DecryptPassword. Я просто сделал самый легкий вещь. Скопировал код из реализации Microsoft, удалил все проверяет, что он делает, а затем использовал его. Следующий класс - пример производная от класса форма SqlMembershipProvider с методом, который просто возвращает пароль в текстовом виде для заданного зашифрованного пароля.

namespace MembershipPasswordRecover
{
    public class NetFourMembershipProvider : SqlMembershipProvider
    {
        public string GetClearTextPassword(string encryptedPwd)
        {
            byte[] encodedPassword = Convert.FromBase64String(encryptedPwd);
            byte[] bytes = this.DecryptPassword(encodedPassword);
            if (bytes == null)
            {
                return null;
            }
            return Encoding.Unicode.GetString(bytes, 0x10, bytes.Length - 0x10);

        }
    }
}

static void Main(string[] args)
{
    var passwordManager = new NetFourMembershipProvider();
    var clearPWd = passwordManager.GetClearTextPassword("encryptedpasswordhere");
    Console.WriteLine(clearPWd);
}