Безопасно сохраняйте электронные письма в черном списке
У меня есть веб-сайт, на котором я хочу, чтобы люди, у которых нет аккаунта, могли отказаться от получения электронных писем. Этого можно достичь, просто сохранив их адреса электронной почты в таблице "черного списка" и просмотрев их перед отправкой некоторой почты.
Чтобы обеспечить защиту данных и по соображениям безопасности, я хочу хранить электронные письма в зашифрованном виде. Я думал о простом md5(password)
, но это слишком легко взломать. Вторая мысль состоит в том, чтобы использовать bcrypt / scrypt, чтобы иметь функцию медленного хеширования, но у них есть немного соли для каждой записи, поэтому мне нужно было бы хэшировать почту для каждой записи для сравнения. Это было бы довольно медленно с временем выполнения O(n)
где n - количество записей в черном списке.
Есть ли другой способ надежно хэшировать почту для быстрого сравнения с черным списком? Так должно быть O(1)
время выполнения, независимо от количества записей.
1 ответ
Вы можете использовать любую функцию получения ключа, например PBKDF2 или даже BCrypt/SCrypt.
Поскольку хэши должны быть доступны для поиска, нельзя использовать уникальные случайные соли. Вместо этого мы можем передать статическую соль, которая действует как ключ на стороне сервера.
С KDF мы можем извлечь выгоду из стоимостного фактора, который значительно замедляет брутфорсинг. Статическая соль / ключ предотвращает грубое форсирование, если у злоумышленника есть доступ к базе данных, но нет привилегий на сервере (ключ остается секретным), это типичный сценарий внедрения SQL-кода. Просто убедитесь, что соль не является частью хеш-строки, большинство реализаций BCrypt сделают это, потому что они предназначены для хеширования пароля.
Проблема этого подхода заключается в том, что он не адаптируется к более быстрому оборудованию в будущем. Но даже если KDF просто нужны несколько миллисекунд, это намного лучше, чем использование простого хэша. Может быть, вы должны спросить об этом по информационной безопасности, они могут знать лучшую альтернативу.