Что касается пункта 1 , функция hash_password()
используется как для генерации хеша пароля (для соли, так и для соли), который хранится в базе данных (например, во время регистрации), так как а также для воссоздания этого хэша, когда необходимо подтвердить пароль (например, во время входа в систему). Функция hash_password()
будет кодировать любую соль, которая задана (или uniqid()
, если ни одна не указана) в самом хэше пароля; это форма шифрования, где ключом является salt_pattern
; если salt_pattern
может храниться в секрете, то это обеспечивает дополнительную безопасность, поскольку злоумышленник не сможет выполнять хэш-перебор в автономном режиме, поскольку метод хеширования не воспроизводится (, если , salt_pattern
может храниться в секрете):
// Signup time; forget about uniqid(); you can use any salt that
// you please; once the password hash is stored in the database there
// is no need to know where your salt came from since it will be
// included in the password hash.
$password_hash = hash_password($password, FALSE);
// Login time; note that the salt is taken from the password hash itself.
$reproduced = hash_password($password, find_salt($password_hash));
$verifies = $password_hash == $reproduced;
Функция hash_password()
сначала хеширует пароль от соли, а затем вставляет каждый символ соли в хеш пароля с соответствующим смещением salt_pattern
. find_salt()
извлечет эти соляные символы, чтобы можно было воспроизвести хэш. Вы можете видеть это как hash_password()
шифрование соли и find_salt()
дешифрование. Хотя вы также можете видеть, что hash_password()
скрывает соль и find_salt()
находит ее, этот метод шифрования нельзя назвать стеганографией , я думаю, поскольку из кода ясно, что соль хранится с хэшем пароля (существование соли не секретно).
Относительно пункта 2 , использование вашей собственной соли просто и полностью совместимо с модулем Auth и уже существующей базой данных.
Что касается пункта 3 , использование соли для каждого пользователя (uniqid()
по умолчанию) составляет , а не избыточное количество. Особенно с MD5, который сломан в целях безопасности и где обнаружение коллизий уже практично с современной технологией. Еще лучше было бы использовать bcrypt()
, который использует целенаправленно более медленный алгоритм хеширования, чтобы помешать попыткам перебора.
Что касается пункта 4 , я раньше не использовал каркас Kohana, но воспроизвести или перенести модуль Auth довольно просто. Необходимо позаботиться о том, чтобы salt_pattern
не был забыт или потерян, поскольку он является неотъемлемой частью алгоритма хеширования. salt_pattern
также следует хранить в секрете, поскольку это единственное, что удерживает решительного противника от перебора паролей. uniqid()
- это просто разумное значение по умолчанию, и его можно заменить на все, что вы хотите (при условии, что это значение для каждого пользователя, а не постоянное значение для всего сайта).
Кроме того, здесь есть очень хороший ответ на стекопоток относительно portable bcrypt()
и PHP . Естественно, что не будет совместимо с модулем Auth, но я бы хотел упомянуть об этом в любом случае, так как лучше всего использовать медленный хеш, а не полагаться на секреты, которые трудно хранить, например salt_patten
.