2014-10-26 2 views
3

Я создаю анонимный сайт. Таким образом, в основном учетная запись пользователя не может быть прослежена до любого фактического лица (например, по электронной почте). Аутентификация - это та часть, о которой я бы хотел подумать. Если я использую коммит электронной почты/пропуск для проверки подлинности, могу ли я использовать bcrypt для хеширования как адрес электронной почты, так и пароль (я знаю, что это возможно, но насколько это практично)? Я думал, что если электронное письмо зашифровано, то будет очень медленно искать db, чтобы найти совпадение. Это правда/ложь? Что ты думаешь? Любые другие идеи? В принципе, я открыт для любых идей о том, как аутентифицироваться, но если он аутентифицирован с помощью электронной почты, он не может быть доступен/дешифрован. Благодаря!bcrypt hash как адрес электронной почты, так и пароль

ответ

1

Как только у вас есть что-то, оригинал никогда не может быть восстановлен.

Давайте возьмем пароль, например, когда пользователь подписывается с адресом электронной почты/паролем, вы получите пароль (с чем-то вроде bcrypt), а затем сохраните хэш в своей базе данных. Это здорово, потому что, если злоумышленник получает копию базы данных, невозможно «дешифровать» хэш.

В вашей ситуации вы, вероятно, НЕ хотите хешировать электронную почту, потому что это означает, что вы никогда не сможете отправить электронное письмо человеку, который, как я предполагаю, вам захочется сделать.

Если вы решите пойти по этому маршруту, в основном вы будете хранить только два пароля на пользователя (это самая близкая аналогия, с которой я мог бы придумать, извините!).

Надеюсь, что это поможет!

EDIT: Лучший способ сделать это - создать новую учетную запись, предоставляемую ТОЛЬКО паролем, - и затем вы автоматически создадите имя пользователя для пользователя. Это то, что делают компании, такие как privateinternetaccess.com, - они генерируют вам случайное имя пользователя - таким образом вы не можете связаться с пользователем, но они все равно могут безопасно войти в ваше приложение.

1

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

Логин:

  1. сообщения пользователя это форма Логина, который имеет читаемый адрес электронную почту и пароль открытого текста (вы, конечно, использовать хороший TLS транспортного шифрование)
  2. а = А (электронную почту), рН = H (пароль)
  3. извлечь запись из базы данных пользователей, где а == stored_eh
  4. сравнить тела против stored_ph

забыл пароль пр ocedure: в тот самый момент, когда пользователь отправляет форму «забыли пароль» с его адресом электронной почты cleartext, у вас есть его электронная почта. compute eh, lookup profile, генерировать токен onetime, хранить его в профиле и помещать его в почту на свой адрес электронной почты. он может использовать токен для определения нового пароля.

изменить процедуру электронной почты: аналогично выше, у вас есть старый или новый адрес электронной почты с открытым текстом в момент публикации формы.

Примечания:

  • БД поиска на шаге 3 не медленнее, чем при использовании открытого текста поиска ключей
  • для 2 и 4, использовать некоторые вменяемый код из хорошо поддерживаемой библиотеки (Scrypt, Bcrypt, pbkdf2, sha512_crypt, а не просто соленый хэш)
  • если злоумышленник получает вашу базу данных и имеет список потенциальных админов электронной почты, он может легко узнать, есть ли у вас (некоторые из них) их как пользователей и определить их пользовательскую запись в вашем дБ. если это проблема, возможно, вы можете использовать h (адрес электронной почты + пароль), но тогда нет возможности восстановления пароля.
+0

Итак, вы в основном говорите: 1) что если я буду шифровать и электронную почту и передавать (отдельно), это не замедлит процесс проверки подлинности и 2) что, если я буду шифровать как (отдельно), так и пользователь забывает свой пароль. Я все еще могу сопоставить учетную запись (потому что электронная почта хэшируется отдельно) и использовать последнее электронное письмо, введенное для восстановления, для отправки по электронной почте маркера смены пароля. И если я не храню адрес электронной почты для восстановления и не храню журналы восстановленных писем электронной почты ... тогда db по-прежнему не отслеживается? – Jeffrey

+0

hmm, некоторые дополнительные примечания: 1), конечно, он будет замедляться на количество времени, затрачиваемого на вычисление еще одного хэша (например, bcrypt) 2) для имени пользователя, вы хотите, чтобы каждый хэш-вычисление выдавал одинаковый хэш для того же имени пользователя, поэтому вы не должны использовать соль здесь [иначе вы не сможете найти запись из базы данных]. для паролей, конечно, вы должны использовать соль, так что у 2 пользователей с одинаковым паролем нет одинакового хэша. –

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