Преобразование паролей членства в ASP.NET из зашифрованного в хешированный - PullRequest
2 голосов
/ 27 апреля 2011

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

Однако новый сайт (на котором сейчас зарегистрировано более 500 пользователей) вызвал у меня некоторую критику, чтоПромышленный стандарт действительно заключается в хешировании паролей.

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

Я знаюЯ могу изменить файл web.config, и пароли новых пользователей будут использовать новый формат.Но это ничего не делает для обновления существующих пользователей.

Примечание. Ранее я задавал похожий вопрос, но в основном только что получил дискуссию о том, что лучше, зашифровано или хешировано.Я прошел эту дискуссию, но мне не удалось найти способ конвертировать их без потери сотен уже зарегистрированных пользователей.

Ответы [ 3 ]

3 голосов
/ 27 апреля 2011

кажется, вы уже знаете, как расшифровать пароли и изменить файл web.config, но вы застряли на том, как реализовать остальную часть процесса.

с использованием ILSpy Вот как сгенерировать соль для каждого пользователя:

byte[] array = new byte[16];
new RNGCryptoServiceProvider().GetBytes(array);
return Convert.ToBase64String(array);    

Как только вы получите соль, вот как сгенерировать пароль:

byte[] bytes = Encoding.Unicode.GetBytes(pass);
byte[] array = Convert.FromBase64String(salt);
byte[] array2 = new byte[array.Length + bytes.Length];
Buffer.BlockCopy(array, 0, array2, 0, array.Length);
Buffer.BlockCopy(bytes, 0, array2, array.Length, bytes.Length);   
using (SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider()) {
  return Convert.ToBase64String(sha1.ComputeHash(array2));
}

, где pass - это обычныйтекстовый пароль , который вы вычислили, а salt - строка, вычисленная в первом фрагменте кода выше. алгоритм по умолчанию - SHA1 , если вам интересно, почему он используется.

, поскольку это однократный процесс, я бы написал обработчик HTTP, чтобы вручную обновлять базу данных во времякороткий, плановый период обслуживания - надеюсь, у вас есть такая роскошь.(очевидно, сделайте резервную копию и протестируйте сначала).Вам необходимо обновить следующие поля в таблице aspnet_Membership:

  1. Password - рассчитано выше
  2. PasswordFormat - 1
  3. PasswordSalt -рассчитано выше

никогда не приходилось делать ничего подобного, но, надеюсь, это поможет вам начать:)

1 голос
/ 27 апреля 2011

ИМХО, ответ Грега (и связанные с ним комментарии) на ваш предыдущий вопрос ( Изменение формата пароля с Encrypted на Hashed ) - это путь.По сути, вы хотите:

  1. Добавить провайдера хэшированного членства
  2. Цикл всех пользователей с зашифрованным паролем,
  3. Для каждогорасшифруйте пароль, создайте хеш, сохраните его, удалите зашифрованную версию из базы данных и двигайтесь дальше.

Когда вы закончите, все пользователи зашифрованного пароля должны быть преобразованы в хешированные.

1 голос
/ 27 апреля 2011

Может быть, я что-то здесь упускаю, но это должно быть довольно просто. Создайте процесс для расшифровки пароля, затем запишите соответствующим образом соль и сохраните хэш расшифрованного пароля пользователя salt + в базе данных. Очевидно, вы не хотите хэшировать зашифрованный пароль пользователя. Не забудьте также хранить соль.

...