.NET custom MembershipProvider расшифровывает пароль - PullRequest
1 голос
/ 08 февраля 2010

Я использую пользовательский MemberShipProvider в проекте ac # на основе кода из: http://www.asp.net/learn/videos/video-189.aspx и по какой-то причине я не могу понять, метод, который расшифровывает пароль пользователя для проверки имени входа, дает дополнительные 8 символов перед значением пароля (например: 锬  慣 嘗  * 锬 锬 пароль ).

Я использую «зашифрованный» passwordFormat, а метод UnEncodePassword состоит в:

private string UnEncodePassword(string encodedPassword)
{
    string password = encodedPassword;
    password = Encoding.Unicode.GetString(DecryptPassword(Convert.FromBase64String(encodedPassword)));

    return password;
}

Спасибо!

Ответы [ 3 ]

6 голосов
/ 08 февраля 2010

"䝉  慣 嘗  㳪 畕 锬" - это соль ? (Обновлено)

На сервере, в файле web.config или другом у вас есть солт-значение, такое как «молочный коктейль». Когда пользователь вводит пароль типа «TheYard», вы добавляете соль и шифруете «milkshakeTheYard». Когда они входят в систему, вы добавляете соль к их запросу и сравниваете ее с зашифрованной строкой.

Так какой смысл в соли? Если зашифрованный пароль попал в чужие руки, «TheYard», состоящий всего из 7 символов, легко найти на Rainbow Table . Добавляя соль, вы значительно усложняете этот процесс.

Соль сама по себе обеспечивает небольшую безопасность, но при использовании в комбинации обеспечивает легко проникающий дополнительный слой.

4 голосов
/ 09 февраля 2010

Вы не сможете расшифровать пароль. Вы должны зашифровать введенный пользователем пароль и сравнить его с сохраненным зашифрованным паролем. Восстановление пароля должно генерировать случайный одноразовый пароль и заставлять пользователя менять его при первом использовании.

2 голосов
/ 09 февраля 2010

Нашли это! Я должен вычесть 16-байтовую соль из моей расшифрованной переменной encodedPassword, чтобы получить пароль:

private string UnEncodePassword(string encodedPassword)
{
    string password = encodedPassword;
    byte[] bytesIn = Convert.FromBase64String(encodedPassword);
    byte[] bytesRet = DecryptPassword(bytesIn);
    password = System.Text.Encoding.Unicode.GetString(bytesRet, 16, bytesRet.Length - 16);

    return password;
}

Спасибо Ян, чтобы дать мне подсказку о соли!

...