Есть ли причина не использовать bcrypt для адресов электронной почты?

Форма входа, над которой я сейчас работаю, использует адрес электронной почты пользователя и пароль для входа в систему. Итак, я подумал, есть ли причина, по которой я не должен использовать bcrypt для адресов электронной почты, например:

$email_hash = password_hash($email, PASSWORD_DEFAULT);

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

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


person Saul Tigh    schedule 21.04.2016    source источник
comment
Нет причин не делать этого, за исключением стоимости. Если кто-то взломает вашу базу данных, он не сможет получить адреса электронной почты, как и вы. Таким образом, если вам нужны адреса электронной почты пользователя для чего-то еще, вы будете обделены шлангом.   -  person Jay Blanchard    schedule 21.04.2016
comment
Электронная почта используется для связи. Если вы хэшируете адреса электронной почты всех своих пользователей, как вы сможете связаться с ними, чтобы сообщить новости/обновления/сброс паролей и т. д.? В этом нет необходимости. Если вы беспокоитесь о том, что ваша база данных может быть взломана, просто убедитесь, что вы обновляете программное обеспечение, и используйте множество других мер безопасности, чтобы этого не произошло.   -  person mferly    schedule 22.04.2016
comment
Вам нужно имя пользователя (адрес электронной почты), чтобы иметь возможность войти в систему. Если вы хэшируете имя пользователя с помощью password_hash, вы каждый раз будете получать другое значение, поэтому единственный способ найти запись пользователя — попробовать каждую. hash и посмотреть, соответствует ли это.   -  person Arjan    schedule 22.04.2016
comment
Причина, предоставленная @Arjan, - лучшая причина не делать этого.   -  person Scott Arciszewski    schedule 22.04.2016
comment
@Arjan Очевидное решение - использовать password_verify() и для адреса электронной почты.   -  person Jay Blanchard    schedule 22.04.2016


Ответы (1)


Вам нужен адрес электронной почты для поиска записи пользователя.

Обычно вы делаете что-то вроде этого:

function create_account(email, password) {
    var pwhash = password_hash($password, PASSWORD_BCRYPT);
    // insert into users values ($email, $pwhash);
}

function login(email, password) {
    // select pwhash from users where email = $email;
    return password_verify($password, $pwhash); // true or false
}

password_hash($email) всегда будет возвращать другое значение, потому что bcrypt включает соль в хеш.

Из википедии:

Например, [хэш bcrypt] $2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy указывает параметр стоимости, равный 10, что указывает на 210 раундов расширения ключа. Соль — это N9qo8uLOickgx2ZMRZoMye, а полученный хэш — IjZAgcfl7p92ldGxad68LJZdL17lhWy.

Или из документов PHP:

Обратите внимание, что password_hash() возвращает алгоритм, стоимость и соль как часть возвращаемого хэша. Поэтому вся информация, необходимая для проверки хэша, включена в него. Это позволяет функции проверки проверять хэш без необходимости отдельного хранения соли или информации об алгоритме.

person Jonathan    schedule 21.04.2016
comment
Кстати, это был вопрос PHP, и вы дали ответ Node.js. :) - person Scott Arciszewski; 22.04.2016
comment
Я думаю, что теперь я правильно PHP'изовал этот псевдокод. - person Jonathan; 22.04.2016
comment
Но вы могли бы использовать password_verify($email, $emailHash) и для электронной почты, не так ли? - person Jay Blanchard; 22.04.2016
comment
Вы могли бы, но тогда вам пришлось бы перебирать всех пользователей в базе данных, чтобы сделать это, потому что у вас не было бы возможности узнать, какой $emailHash использовать. - person Jonathan; 22.04.2016