Использует ли has_secure_password какую-либо форму соления?

Я хочу использовать has_secure_password для хранения зашифрованных паролей в базе данных. Я не могу найти в Интернете, использует ли has_secure_password какую-либо форму соления. Если он использует соление, как это работает? Может ли кто-нибудь прояснить это для меня?

Тайс


person Thijs    schedule 13.04.2012    source источник


Ответы (1)


has_secure_password использует bcrypt-ruby. bcrypt-ruby автоматически обрабатывает хранение и создание солей для вас. Типичный хэш от bcrypt-ruby выглядит так: $2a$10$4wXszTTd7ass8j5ZLpK/7.ywXXgDh7XPNmzfIWeZC1dMGpFghd92e. Этот хэш разделяется внутри с помощью следующей функции:

def split_hash(h)
  _, v, c, mash = h.split('$')
  return v, c.to_i, h[0, 29].to_str, mash[-31, 31].to_str
end

Для хэша примера эта функция дает:

  • версия: 2а
  • стоимость: 10
  • соль: $2a$10$4wXszTTd7ass8j5ZLpK/7.
  • хэш: ywXXgDh7XPNmzfIWeZC1dMGpFghd92e

==-функция BCrypt::Password извлекает соль и применяет ее к переданной строке:

BCrypt::Password.create('bla') == 'bla' # => true
person fabi    schedule 13.04.2012
comment
Я полагал, что автор спрашивал об отдельной колонке для соли. У нас нет возможности контролировать эту соль, поэтому для пользователя она действует как удлинитель хэша — компрометация всего 1 столбца делает взлом нашего пароля лишь вопросом времени. - person jdoe; 13.04.2012
comment
Вопрос был «Использует ли has_secure_password какую-либо форму соления?», И это так. Я думаю, что в большинстве случаев скомпрометирована вся база данных, поэтому не имеет значения, сохраняется ли соль в дополнительном столбце. Однако вы правы в том, что это более безопасно, если скомпрометирован только один столбец базы данных. - person fabi; 13.04.2012
comment
Привет, Фаби, спасибо за ответ, пожалуйста, проголосуйте за вопрос, если вы считаете, что он интересен / применим для более широкой аудитории. - person Maarten Bodewes; 15.04.2012
comment
Чтобы прояснить, что говорит fabi, bcrypt-ruby автоматически генерирует соль и объединяет ее с хешированным паролем в столбце password_digest. См. github.com/codahale/bcrypt-ruby#salts. - person Ryan Crispin Heneise; 08.07.2015
comment
Забавный факт: has_secure_password / bcrypt-ruby также укрепляет ваш пароль, который, по сути, хеширует хэш. Стоимость - это значение закалки. В этом случае стоимость 10 означает, что хэш был хеширован 1024 раза. См.: calebwoods.com/2014/08/26/owasp. -пароль-хеширование-ruby - person Aaron Gray; 22.09.2015
comment
Не отвечает на вопрос пользователя. Пользователь спросил, можем ли мы сами добавить соль? Потому что, когда я тестировал пример пароля indu и проверял хэш, сгенерированный разными версиями bcrypt и на разных машинах, хэш был одинаковым. Если бы он был с солью, разные установки/приложения генерировали бы разные хэши, поэтому, если была взломана база данных, но не файл, в котором упоминалась соль, хакер не сможет проверить хэши паролей по какой-либо базе данных хэшей. - person Indu Pillai; 15.08.2017
comment
Я предполагаю, что что-то не так с вашей средой, когда я повторно запускаю BCrypt::Password.create('indu') в irb, я получаю другой хэш с каждым вызовом (как и ожидалось). - person fabi; 15.08.2017