2013-10-24 11 views
2

Можно ли указать, какая соль используется при шифровании строк с помощью ruby-bcrypt?Ruby-BCrypt: укажите соль

Я знаю, что это не очень безопасно, но я использую его только для данных с не высокой степенью защиты: У меня есть форма данных, и когда пользователь удаляет свою учетную запись, я все еще хочу знать, был ли этот пользователь зарегистрирован этим письмом до (из-за свободных кредитов при регистрации).

Поэтому я думал, что буду шифровать письмо с помощью Bcrypt (перед удалением), а позже я могу запросить его, если этот хэш существует, когда пользователь хочет снова зарегистрироваться с этим адресом электронной почты?

Но теперь я понял, что bcrypt всегда предлагает новую соль ... Могу ли я указать соль как-нибудь?

Спасибо,

ОТКАЗ/ВНИМАНИЕ:

ВООБЩЕ ВЫ НИКОГДА НЕ ДОЛЖНЫ УКАЗАТЬ СОЛИ НАПРЯМУЮ - ЕГО небезопасных !!!

+0

Не можете ли вы сохранить уникальную соль где-нибудь вместе с хэшем пароля?(Если у вас есть только одно поле для работы с вами, вы можете просто вставить известный разделитель между хэшированным адресом электронной почты и солью) – struthersneil

+1

Подождите, я идиот. Bcrypt уже хранит хэш + соль. – struthersneil

ответ

4

Вы могли использовать BCrypt::Password.create, передавая его по электронной почте, чтобы произвести эти хэши вместе с уникальной солью.

2.0.0-p195 :003 > hashed_email = BCrypt::Password.create '[email protected]' 
=> "$2a$10$vX2tl3omW9h4k66XC7/BwOFH0n7EqtH4PJATPa7YVSeJh7TEpt/bK" 
2.0.0-p195 :004 > hashed_email = BCrypt::Password.create '[email protected]' 
=> "$2a$10$RdQIHtz.L5To1F1XRK//..h6nHYdQ3uJ2PTgB58e3xufoqgZGqbO6" 
2.0.0-p195 :005 > hashed_email = BCrypt::Password.create '[email protected]' 
=> "$2a$10$bTFVXO/d0/sf6SxzCcRMU.zBPcR5yjI6ID6O9J2eXKbqim/jPM3PC" 
2.0.0-p195 :006 > hashed_email = BCrypt::Password.create '[email protected]' 
=> "$2a$10$gbXU4UEiHTC0HCnD672Dm.TeBhZeCa6sBiX8Pk50KSXcprDJnEYA." 

Теперь вам не придется беспокоиться об использовании фиксированной соли в BCrypt уже хранится его хэш для вас.

Но, я думаю, вы определили, что это означает, что позже будут связаны затраты на обработку, связанные с этим сравнением, хотя вы не можете просто выполнить команду «SELECT user WHERE email_hash = hash» ...

Если вы абсолютно хотите использовать фиксированную соль, вы можете.

salt = BCrypt::Engine.generate_salt 
hash = BCrypt::Engine.hash_secret 'hello', salt 

(. Просто хранить эту соленую строку где-нибудь, и вы можете использовать его позже)

+1

OP нуждается в фиксированной соли, так что поиск по электронной почте для БД будет работать без необходимости хранить открытый текст электронной почты. Я сделал аналогичную работу для черных списков кредитных карт и AFAIK, единственным решением для сохранения результатов поиска является использование фиксированной соли. –

+1

Это то, что я описываю после второго абзаца. – struthersneil

+0

Или еще один способ выразить это: «Это означает, что позже будут связаны затраты на обработку, связанные с последующим сравнением», предполагая, что сайт достаточно популярен, чтобы было проверено тысячу писем, вы говорите * минуты * о времени процессора для системы, чтобы выяснить, была ли регистрация раньше. По каждой регистрации. –

5

Да, вы можете:

BCrypt::Engine.hash_secret('[email protected]', "$2a$10$ThisIsTheSalt22CharsX.") 

Первые 7 символов технически не соль, они идентифицируют bcrypt, и установите количество итераций на 2 ** 10 == 1024. Для простоты, однако, модуль bcrypt Ruby рассматривает первые символы как часть соли, поэтому вам также нужно. Вы, вероятно, следует использовать

BCrypt::Engine.generate_salt 

Для создания общей соли, так как это не зависит от вас, чтобы придумать что-то «случайным».

Чтобы немного улучшить безопасность, вы можете сохранить соль отдельно от доступных для поиска хэшей и относиться к ней так же, как любые другие секретные данные в приложении. Например, сделайте его элементом конфигурации и сохраните только хэш-часть bcrypt для поиска (первая часть - это избыточные данные для вас в любом случае и уменьшит производительность поиска, хотя этот эффект, вероятно, очень мал):

email = '[email protected]' 
full_hash = BCrypt::Engine.hash_secret(email, settings.email_search_salt) 
searchable_hash = full_hash[29,31] 
# Either store or search . . . 
+0

Ваш ответ правильный, но я буду принимать ответ struthersneil, так как он отправил первый ... Но спасибо! Я отвечу на ваш ответ. – Lichtamberg

+0

Я выделил это для расширенной детали. – struthersneil

 Смежные вопросы

  • Нет связанных вопросов^_^