Моя следующая задача будет состоять в том, чтобы зашифровать пароли. Я работаю на слое доступа к базе данных, и мой коллега выполнил этот запрос: реализуйте хеш SHA-512 на пустом методе. Как я могу сделать это?
Довольно простой процесс:
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. Несколько замечаний:
как хешировать пароль?
С солью. Действительно.
Никогда, никогда не делайте этого:
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 голосами за, когда кто-то, кто не мог понять, что за соль, продолжал прибегать с техно-модными словечками, чтобы защитить свою позицию ... И все же у него были все эти голоса (слишком ленив, чтобы нашел вопрос но это было эпично).
Вы должны использовать bcrypt , который более безопасен для паролей, чем SHA512.
Если вам действительно нужно использовать SHA512, вы должны использовать класс SHA512Managed
, как упоминалось в других ответах.
Не забудьте солить хеш.
Пример C # с этой страницы:
byte[] data = new byte[DATA_SIZE];
byte[] result;
SHA512 shaM = new SHA512Managed();
result = shaM.ComputeHash(data);