Расшифровка «зашифрованного» пароля от членства в ASP.NET 2.0 - PullRequest
16 голосов
/ 03 июня 2011

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

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

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

Я нашел страницу MembershipProvider.DecryptPassword ,но я все еще не могу понять, как на самом деле использовать это в моем коде.Я также нашел другие страницы, через Google, но большинство примеров расшифровки пароля, похоже, не учитывают соли и decrytionKey.

У кого-нибудь есть прямой пример выбора пароля, passwordsalt иключ дешифрования из их соответствующих местоположений и использование их для дешифрования пароля зашифрованного членства ASP.NET 2.0?

1 Ответ

13 голосов
/ 04 июня 2011

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

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

Просматривая код в отражателе, я увидел, что провайдеры 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);
}
...