Я ищу простое и безопасное решение для хранения пароля пользователя с помощью Node. Я новичок в криптографии, но пытаюсь собрать решение вместе с исследованиями в Интернете. Я ищу подтверждение того, что то, что я придумал, является надежным решением для веб-приложения с базовыми (не банками, больницами и т. д.) потребностями безопасности. Вот:
var crypto = require('crypto');
var SALT_LENGTH = 64;
var KEY_LENGTH = 64;
var ITERATIONS = 1000;
function createHashedPassword(plainTextPassword, cb) {
crypto.randomBytes(SALT_LENGTH, function (err, salt) {
console.time('password-hash');
crypto.pbkdf2(plainTextPassword, salt, ITERATIONS, KEY_LENGTH, function (err, derivedKey) {
console.timeEnd('password-hash');
return cb(null, {derivedKey: derivedKey, salt: salt, iterations: ITERATIONS});
});
});
};
... и вот выбор, который я сделал, который привел меня к этому моменту:
Какой алгоритм хеширования использовать?
Основываясь на этой широко цитируемой статье, похоже, что ведущими претендентами являются PBKDF2, bcrypt и scrypt . Я выбрал PBKDF2, потому что он имеет встроенную поддержку в Node.
Какой размер соли использовать?
Этот ответ о переполнении стека показался мне самым простым ответом, который я смог найти. Я все еще не очень понимаю, почему 64 байта - это правильный размер соли. Когда я гуглю, я получаю другие ответы на обмен стеками, такие как this, но я не уверен, что это применимо к алгоритму Node? Совершенно запутанный здесь, объяснение, предназначенное для новичка, использующего эту функцию Node, было бы потрясающим.
Какую длину ключа использовать?
Еще раз, я в основном основывал свой выбор на том же ответе, что и выше, но я м так же туманен в основах «почему». В ответе говорится, что «генерировать ключи меньше, чем ваш ввод, бесполезно, поэтому используйте не менее 64 байт». Хм? Еще раз, практическое объяснение было бы полезно.
Сколько итераций использовать?
Для этого вопроса я основывал свой выбор на этом ответе на обмен стеками. Я мало что в этом понимаю, но я понял, что алгоритм должен занимать примерно 8 мс. Итак, как вы можете видеть, я установил таймеры для функции и настроил свои итерации, чтобы получить ее на этом приблизительном уровне на моей машине.
Спасибо!