Как хешировать пароль?

Моя следующая задача будет состоять в том, чтобы зашифровать пароли. Я работаю на слое доступа к базе данных, и мой коллега выполнил этот запрос: реализуйте хеш SHA-512 на пустом методе. Как я могу сделать это?

7
задан Peter Mortensen 13 April 2013 в 13:43
поделиться

4 ответа

Довольно простой процесс:

byte[] data = Encoding.UTF8.GetBytes(stringPasswordForExample);

using(SHA512 sha512 = new SHA512Managed())
{
    byte[] hash = sha512.ComputeHash(data); // Add Per User Salt as per the Below
}

hash теперь содержит необратимый хэш исходных данных, которые вы хотели захешировать. Также ознакомьтесь с MSDN. Несколько замечаний:

  • Всегда используйте соль (чем длиннее, тем лучше, и уникальную для каждого пользователя - спасибо, Пол, хорошее замечание).
  • Хэш-методы поколения SHA2* (и SHA в целом) созданы для скорости, поэтому они не являются небезопасными, но они и не самые безопасные. Посмотрите на bcrypt, а также SLaks уже упоминал.
10
ответ дан 6 December 2019 в 06:23
поделиться

как хешировать пароль?

С солью. Действительно.

Никогда, никогда не делайте этого:

byte[] data = Encoding.UTF8.GetBytes(stringPasswordForExample);

Но это:

byte[] data = Encoding.UTF8.GetBytes(stringPasswordForExample + salt);

Это одна из наиболее неправильно понимаемых «уловок». Большинство людей не знают, что такое «соль», и когда вы им это объясняете, они думают, что это бессмысленно.

На самом деле: SHA-512 или MD5 или какой-нибудь очень слабый хэш, после предварительного вычисления радужных таблиц не имеет никакого значения. SHA-65536, если он существует (я шучу здесь), был бы не лучше любого другого алгоритма хеширования после предварительного вычисления радужных таблиц.

Достаточно большая «соль» делает невозможными радужные таблицы:

http://en.wikipedia.org/wiki/Rainbow_table

Обратите внимание, что даже если вы полностью понимаете, как соотносятся хеши, соли и радужные таблицы (и поэтому поймите, почему статья в Википедии гласит: «Соль часто используется с хешированными паролями, чтобы сделать эту атаку более сложной, часто невыполнимой». ) очень высока вероятность того, что ваши коллеги этого не сделают. Точно так же, как очень вероятно, что большинство людей, голосующих за и против в этой ветке, не понимают эту тему.

Я видел здесь ответы на SO с 30 голосами за, когда кто-то, кто не мог понять, что за соль, продолжал прибегать с техно-модными словечками, чтобы защитить свою позицию ... И все же у него были все эти голоса (слишком ленив, чтобы нашел вопрос но это было эпично).

7
ответ дан 6 December 2019 в 06:23
поделиться

Вы должны использовать bcrypt , который более безопасен для паролей, чем SHA512.

Если вам действительно нужно использовать SHA512, вы должны использовать класс SHA512Managed , как упоминалось в других ответах.
Не забудьте солить хеш.

10
ответ дан 6 December 2019 в 06:23
поделиться

SHA512 Class

Пример C # с этой страницы:

byte[] data = new byte[DATA_SIZE];
byte[] result;
SHA512 shaM = new SHA512Managed();
result = shaM.ComputeHash(data);
1
ответ дан 6 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: