Создание соли с помощью фреймворка Portable PHP Password
Я хотел бы использовать Portable PHP для хэширования паролей. Но я обнаружил, что его демоверсии не используют соль для хеширования пароля. Но он использует фиктивную соль для проверки пароля, что мне кажется странным, и я совсем не понимаю эту идею,
$dummy_salt = '$2a$08$1234567890123456789012';
if (isset($dummy_salt) && strlen($hash) < 20)
$hash = $dummy_salt;
Интересно, если я хочу использовать условный метод, который позволяет генерировать уникальную соль и сохранять ее для каждого пользователя в моей базе данных, как я могу использовать платформу хэширования переносимого пароля PHP для генерации солей?
Это функция, которую я использую для хэширования паролей, но мне сказали, что у sha512 та же проблема, что и у sha1, разумно доверять такому эксперту, как Portable PHP Framework для хэширования паролей,
function hash_sha512($phrase,&$salt = null)
{
//$pepper = '!@#$%^&*()_+=-{}][;";/?<>.,';
if ($salt == '')
{
$salt = substr(hash('sha512',uniqid(rand(), true).PEPPER_KEY.microtime()), 0, SALT_LENGTH);
}
else
{
$salt = substr($salt, 0, SALT_LENGTH);
}
return hash('sha512',$salt.PEPPER_KEY.$phrase);
}
Дайте мне знать, если у вас есть идеи. Благодарю.
1 ответ
Из статьи phpass, на которую ссылается эта страница:
Помимо фактического хэширования, phpass прозрачно генерирует случайные соли при хэшировании нового пароля или парольной фразы и кодирует тип хэша, соль и счетчик итераций расширения пароля в возвращаемую "строку кодирования хэша". Когда phpass аутентифицирует пароль или парольную фразу для сохраненного хеша, он аналогичным образом прозрачно извлекает и использует идентификатор типа хеша, соль и счет итерации из "строки кодирования хэша". Таким образом, вам не нужно беспокоиться о солении и растяжении самостоятельно - phpass позаботится об этом за вас.
... так что не удивительно, что в примерах не используется соление! Возможно, вы перегружаете свой код.
Пример кода с фиктивной солью является примером того, как предотвратить атаку по времени, убедившись, что независимо от того, существует ли пользователь или нет, проверка пользователя занимает одинаковое количество времени, эффективно путем выполнения фиктивной аутентификации для несуществующего пользователи. Ему нужна фиктивная соль, потому что, если пользователь не существует, у него не будет сохраненной соли для использования.