Мой текущий проект является моим первым в Node.js (также с использованием MongoDB, Mongoose и Express, если это имеет значение), и, будучи легко отвлеченным, я упал на кроличью нору криптографии, решая, как обрабатывать аутентификацию пользователя. (Никакого другого шифрования в этом проекте не требуется).Я правильно хранил пароли?
После рисунка на this page (шаблон, а не код - У меня возникли проблемы с установкой node.bcrypt, но не с узлом-натрия) и also this page мой процесс
новый пользователь отправляет пароль через HTTPS
схема генерирует соль
схемы хэширует конкатенацию пароля и соль
схемы хранит соль и пароль с информацией о пользователе
Теперь я не знаю, если это мой личный недостаток, но у меня возникли проблемы следующие the libsodium documentation. node-sodium не предоставляет дополнительной информации для хэширования (хотя у него есть пример для шифрования).
Это код, который я хочу использовать для создания хэша:
let buf = new Buffer(sodium.crypto_pwhash_STRBYTES);
sodium.randombytes_buf(buf, sodium.crypto_pwhash_STRBYTES);
let salt = buf.toString();
let preBuffer = "somePass" + salt;
let passwordBuf = Buffer.from(preBuffer);
let hash = sodium.crypto_pwhash_str(passwordBuf, sodium.crypto_pwhash_OPSLIMIT_INTERACTIVE, sodium.crypto_pwhash_MEMLIMIT_INTERACTIVE);
Таким образом, вопрос из двух частей. Это хороший процесс, и подходит ли этот код?
Этот код является __completely broken__ с точки зрения безопасности. Один проход SHA512 __not__ достаточен для хэширования паролей и абсолютно не эквивалентен использованию фактического хэша пароля. Не зная, откуда приходит ваша функция «rand», я также подозреваю, что она не обеспечивает криптографически безопасных случайных значений и поэтому также небезопасна. См. Также здесь: https://paragonie.com/blog/2016/02/how-safely-store-password-in-2016 –
@Alan [Рекомендуемое чтение] (http://www.cryptofails.com/post/75204435608/записи крипто-кода Dont публиковать-его). –
@ScottArciszewski спасибо за статью – Alan