используя sha256 в качестве хеширования и посола с идентификатором пользователя - PullRequest
1 голос
/ 11 января 2010

Я буду использовать sha256 для своего сайта, чтобы защитить пароли своих пользователей, и в качестве соли я думал об использовании идентификатора пользователя (int auto_increment). это будет уникальным, но не очень длинным и сложным и публичным (user.php? id = 1), но это просто имеет значение, если его уникальное право?

hash('sha256', $id . $password);

Ответы [ 4 ]

8 голосов
/ 11 января 2010

Да, важно, чтобы соль была уникальной (коллизии достаточно маловероятны), но она также должна обладать достаточной энтропией (быть случайной и достаточно длинной).Идентификаторы пользователей не случайны и могут быть слишком короткими, поэтому лучше всего использовать случайно сгенерированные строки и сохранять их в своей базе данных вместе с хешем.

Предположим, что пользователь с UID 9 выбирает глупый пароль:password.Результирующая строка, которая будет хэшироваться, может тогда быть 9password.Вы можете себе представить, что даже в этом случае полная строка может появиться в радужных таблицах (таблицах, которые содержат много-много хэшей с их исходной строкой).

Если соль в этом случаебудет, например, OTAzMzYzODQzMjk5NTM1NDc1N, строка, которую нужно хэшировать, будет OTAzMzYzODQzMjk5NTM1NDc1Npassword, что вряд ли появится в радужных таблицах.Кроме того, входные строки намного длиннее, что снижает риск атак методом перебора.

2 голосов
/ 11 января 2010

Это бы сработало, но цель использования соли - дифференцировать хеш-ключ для усиления алгоритма шифрования. Было бы намного лучше использовать уникальную, случайно сгенерированную / соленую по времени строку для соли. Также было бы лучше не включать соль и хэш-ключ в одну таблицу.

0 голосов
/ 11 января 2010

Не думаю, что это хороший выбор: я бы использовал более случайную соль, сохраняя ее в записи пользователя. Возможно сохранение в поле пароля этой строки: sha256 ($ password. $ RandomSalt). '$'. $ RandomSalt

Таким образом, вы можете получить соль для проверки пароля при входе в систему.

(В любом случае, вы можете использовать другое поле только для соли)

0 голосов
/ 11 января 2010

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

   date('U')

, что намного более безопасно из-за его длины, уникальности и того факта, что вы храните его в БД и не делаете его общедоступным Затем вы использовали бы его таким образом:

$hash = date('U');
$pass = hash('sha256', $hash . $password);

и проверка паролей при входе в систему:

// return query object based on matching email/username
if ($userobj->pass === hash('sha256', $userobj->salt .$_POST['pass'])) {
    // correct pass
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...