Безопасно ли посолить пароли на базе 64?
В веб-приложении я читаю несколько байтов из /dev/urandom, чтобы получить случайную соль для хэширования паролей.
Это хорошо для base64 соли до хеширования? Потому что в кодировке base64 иногда добавляется some = в конце, что может привести к известной атаке открытого текста. Но это может не быть проблемой, потому что соль все же хранится в БД, или я ошибаюсь?
Влияет ли это на безопасность приложения?
4 ответа
По большей части, вероятно, нет. Ваша соль должна быть известна, чтобы расшифровать пароль, поэтому мы можем предположить, что любой злоумышленник сможет получить как хешированный пароль, так и используемую соль. Все, от чего ваша соль теперь защищает, это атаки на основе радужных таблиц и увеличение объема работы (поскольку каждый открытый текст теперь нужно хешировать n
раз, а не один раз, чтобы сравнить с n
пароли).
Пока ваша соль имеет разумную длину, вы, вероятно, в порядке.
Это зависит от используемого алгоритма хеширования, какой алфавит символов принимается как соль. Например, BCrypt будет принимать следующие символы, которые почти совпадают с текстом в кодировке base64:./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
,
Известная атака обычным текстом здесь не проблема, поскольку мы ничего не шифруем, особенно соль.
Нет, это не безопасно.
Вы не должны использовать хеш-функции для паролей пользователей. Вместо этого вы должны использовать основанную на пароле функцию получения ключа, такую как PBKDF2 или scrypt с соответствующим количеством итераций, чтобы замедлить хэширование, что снижает риск атак методом перебора.
В чем разница между функцией получения ключа и хэшем пароля?
Если вы используете PHP для своего веб-приложения:
Нужно ли base64 кодировать мою соль (для хеширования паролей)?
Цель соли - убедиться, что каждый пароль хранится по-разному. То есть, если два человека используют один и тот же пароль, хранение двух паролей не идентично. Это защищает от радужных и хэш-таблиц атак, если злоумышленнику удается извлечь данные из таблицы паролей.
Хотя для Base64 нет никаких причин - хеш должен быть последовательностью байтов, а не текстом ASCII - это не должно влиять на безопасность ваших хешированных паролей. Да, будут использоваться ограниченные последовательности байтов (только те, которые представляют действительные символы ASCII), однако ваш хэш будет длиннее и будет представлять тот же диапазон возможных значений.