2017-02-09 8 views
2

Мой текущий проект является моим первым в Node.js (также с использованием MongoDB, Mongoose и Express, если это имеет значение), и, будучи легко отвлеченным, я упал на кроличью нору криптографии, решая, как обрабатывать аутентификацию пользователя. (Никакого другого шифрования в этом проекте не требуется).Я правильно хранил пароли?

После рисунка на this page (шаблон, а не код - У меня возникли проблемы с установкой node.bcrypt, но не с узлом-натрия) и also this page мой процесс

  1. новый пользователь отправляет пароль через HTTPS

  2. схема генерирует соль

  3. схемы хэширует конкатенацию пароля и соль

  4. схемы хранит соль и пароль с информацией о пользователе

Теперь я не знаю, если это мой личный недостаток, но у меня возникли проблемы следующие 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); 

Таким образом, вопрос из двух частей. Это хороший процесс, и подходит ли этот код?

ответ

-2

Лично я использовал crypto, и я делаю то же самое 4 шага, которые вы делаете прямо сейчас (после проверки нескольких условий проходит 7 символов, один символ, одно число ...). Я передам код, используя криптографию.

var salt =rand(160, 36);  
var salted_pass = salt + password; 
var token = crypto.randomBytes(64).toString('hex'); // I even generate a token for my users 
var hashed_password = crypto.createHash('sha512').update(salted_pass).digest("hex"); 

EDIT: Внимание это не укомплектовать безопасный способ сделать это, так как это может превратить predictibly. Обратитесь к комментариям ниже, которые объясняют, почему это не хороший метод.

+1

Этот код является __completely broken__ с точки зрения безопасности. Один проход SHA512 __not__ достаточен для хэширования паролей и абсолютно не эквивалентен использованию фактического хэша пароля. Не зная, откуда приходит ваша функция «rand», я также подозреваю, что она не обеспечивает криптографически безопасных случайных значений и поэтому также небезопасна. См. Также здесь: https://paragonie.com/blog/2016/02/how-safely-store-password-in-2016 –

+0

@Alan [Рекомендуемое чтение] (http://www.cryptofails.com/post/75204435608/записи крипто-кода Dont публиковать-его). –

+0

@ScottArciszewski спасибо за статью – Alan

3

Я использовал пакет scrypt-for-humans в прошлом именно по этой причине.

https://github.com/joepie91/scrypt-for-humans

Scrypt очень надежна библиотека хэширования и это более высокий уровень обертка делает это трудно для вас, чтобы ничего испортить. Это также специально разработано для безопасного хэширования паролей, так что это тоже положительно :)

0

В настоящий момент лучшим алгоритмом хэширования пароля является Argon 2. Существует модуль под названием secure-password, написанный Emil Bay. Он говорит больше о криптографически безопасном хэшировании и передовой практике. on this podcast. Вот фрагмент того, что он сказал о Argon 2.

Обычно, когда вы выставляете модель угрозы, идеальная защита с математической точки зрения практически никогда не бывает практичной.(В криптографии можно назвать совершенной секретностью, что означает, что даже если у вас огромный компьютер размером с вселенной, неважно, насколько он велик, вы никогда не сможете сломать безопасность, но это не очень практично в реальный мир.) Вместо этого вы идете на что-то, называемое компьютерной тайной. Это означает, что вы можете сломать это, но это будет стоить вам слишком много денег и займет слишком много времени.

Цель этих хэш-функций состоит в том, чтобы сделать так дорого, чтобы переборщить эти алгоритмы, чтобы не было смысла пытаться. В модели угроз вы знаете, что не получите идеальной безопасности, но можете ли вы сделать так дорого, чтобы ваш противник напал на вас.

Argon 2 имеет два параметра, которые делают его невосприимчивым к крупномасштабным атакам GPU. Вы можете контролировать, сколько памяти функция разрешено использовать, и вы можете контролировать, сколько времени вычислений принято для создания хэша. Процессор обычно имеет много памяти, но несколько ядер. Графический процессор имеет очень мало памяти, но тысячи ядер. Argon 2 набирает много памяти, что вы можете делать только 4 или 8 одновременных Argon 2 хэшей на одном графическом процессоре, что делает его слишком дорогим, чтобы попробовать и взломать. В secure-password, я взял ценности, которые Фрэнк Дениз, который сделал натрий, который он построил на выясненном. Он находится в рамках интерактивного сервиса, например, веб-сайт может позволить себе создать разумную безопасность без замедления. Для хеширования пароля вам потребуется около 16 или 32 Мб памяти, и эти параметры можно контролировать в Argon 2.