Пример кода для Scrypt и Cryptsharp
-
22-12-2019 - |
Вопрос
Я искал по всему Google и не могу найти пример кода использования Scrypt (для хеширования пароля), используя Криптшарп библиотека.
Можете ли вы предоставить образец хеширования пароля?
Решение
Это только один звонок поэтому я расскажу вам о параметрах:
key
:это ваш пароль, используйте кодировку UTF-8 (без знака порядка байтов), чтобы закодировать пароль в массив байтов;salt
:строка безопасных случайных байтов, хранящаяся вместе с результатом функции scrypt, 16 байт должно быть достаточно;cost
:предлагаемый номер — 262144, но вы можете увеличить это значение, если ваш сервер сможет справиться с дополнительной нагрузкой;blockSize
:смотрите стоимость, данное предложение 8;parallel
:Я бы оставил это значение равным 1, если вы не хотите экспериментировать с многопоточностью;maxThreads
:в общемnull
подойдет;derivedKeyLength
:ну, это зависит от того, для паролей 128 должно быть достаточно, маловероятно, что ваш пароль имеет более 128 бит безопасности.
Вам следует сохранить хотя бы соль и результат.Возможно, вы захотите использовать кодировку Base 64, если хотите хранить их в виде строк.
Я бы порекомендовал вам сохранить еще один фрагмент данных:версия вашей схемы создания ключей на основе пароля (PBKDF).Скажем, установите его на 1
для использования сценария, с использованием заданной кодировки ключа, размера соли, стоимости, размера блока и т. д.В этом случае вы можете обновить свою схему позже (для этого вам нужно, чтобы пользователь предоставил свой пароль, поэтому вам придется сделать это онлайн, так что в конечном итоге у вас будет работать несколько схем одновременно).
Обратите внимание, что вы можете объединить вызовы функций PBKDF, чтобы вы могли использовать исходный вывод PBKDF и использовать его в качестве входных данных для следующего PBKDF.В этом случае пользователю не нужно вводить пароль (эта подсказка была взята из CodesInChaos по другому вопросу).
Другие советы
@maartebbodewes предоставляет отличный ответ с очень мудрыми дополнительными советами.Вот образец кода с его рекомендациями.Я бы также предложил прочитать « Ваш пароль слишком чертовски короткий 'Это показывает важность использования современной криптографии, как (на момент написания) BCRYPT или Scrypt .
public string Hash(string secret, string salt)
{
var keyBytes = Encoding.UTF8.GetBytes(secret);
var saltBytes = Encoding.UTF8.GetBytes(salt);
var cost = 262144;
var blockSize = 8;
var parallel = 1;
var maxThreads = (int?)null;
var derivedKeyLength = 128;
var bytes = SCrypt.ComputeDerivedKey(keyBytes, saltBytes, cost, blockSize, parallel, maxThreads, derivedKeyLength);
return Convert.ToBase64String(bytes);
}
.