В базе я храню хеши, созданные с помощью bcrypt (Node.js)
Хеширование происходит с использованием определенного значения salt.
Встречаю в примерах кода, что люди хранят в базе помимо самого хеша, значение соли. Зачем?
Ну допустим злоумышленник получил базу с хешами, подобрал соль, и начал взламывать пароли (я правильно понмаю процесс?). Каким образом хранение значения, и смена соли поможет мне? Ведь если поменяю соль, то хеш тоже станет другой, и вся моя база хешей станет не валидной.
Смотря в каком формате ваша функция возвращает хэш, если он уже и так содержит соль, то хранить её отдельно не имеет никакого смысла. Если допустим используете этот пакет для вычисления и проверки хэша, то там хэш полученный уже содержит соль.
hckn, нет смысла. Во всяком случае можете проверить, если без отдельного задания соли будет работать функция проверки хэша (возвращать true на правильном пароле и false на неправильном) - то отдельно задавать соль бессмысленно.
Встречаю в примерах кода, что люди хранят в базе помимо самого хеша, значение соли. Зачем?
у тебя в базе у 3х юзеров пароль "qwerty", узнав хэш для слова "qwerty", можно получить доступ к 3м аккаунтам
В варианте с солью нужно искать 3 разных хэша
Т.е. для каждого юзера, перед созданием хеша, выбирать рандомную соль, например в диапазоне 10-16 для bcrypt, и сохранять это значение рядом с самим хешем, и потом при compare также доставать это же значение соли и его использовать?
Ок. А теперь допустим что есть необходимость в смене значения соли. Что дальше? Хеш-то у меня по проежнему старый, а значит при следующем логине юзера мне надо будет опять сравнивнивать правильность ввода пароля со старым хешем (со старой солью). Получается, при последующем логине мне надо выполнить хеш 2 раза - со старой солью, чтобы проверить правильность пароля, а потом згенерировать новый хеш с новой солью? Ппц, это гемор) Я праавильно понял принцип, или надо/можно по другому?
hckn, чаще всего отдельно генерировать соль не имеет смысла, обычно функция сама генерирует рандомную соль, если никакую ей не задавать. Читайте документацию, там обычно написано, с какими параметрами вызывать, чтобы получить случайную соль
А менять значение соли для уже сгенерированного хэша - не вижу случаев, когда это может понадобиться. При утечке хэшей для каждого солёного хэша подбирать пароль придётся всё равно индивидуально (в отличие от несолёных хэшей, которые можно подобрать для всех сразу) - потому разницы никакой не будет, какая именно соль там, важно только, чтобы они были достаточно случайными и не повторялись (но и если случайно повторится 2-3 соли - это не смертельно, просто злоумышленник эти конкретные 2-3 пароля сможет подбирать вместе, что чуточку ему облегчит задачу, но не сильно). А если хэш утёк, то поможет разве что смена самого пароля, а не соли (к тому моменту, как злоумышленник вычислит старый, если ему хватит на это вычислительной мощности - этот пароль уже не будет подходить).
Занимает несколько секунд, но ведь так и надо - время это и есть главная защита от взлома. Если будет виснуть, тогда попробую генерацию хешей вынести в микросервис. Сейчас по идее не должно блокировать, функция же асинхронная?
А если bcrypt рандомно выбирает соль, то откуда он знает какое значение использовать при последующем compare? Этого всего в документации npm пакета нету! Вероятнотно надо читать спецификацию самого принципа шифрования, но это наверное перебор в моем случае, хотя тема интересная.