о солевых ценностях
Если я правильно понимаю, чем дольше
соль, чем больше стол
хакер должен генерировать, чтобы
сломай хеш Пожалуйста, поправьте меня, если я
я неправ.
Да, это правильно. Хотя, если кто-то пытается сломать хеш только одного пользователя, значения соли бесполезны. Соли полезны для предотвращения (замедления) атакующих словарных атак на хэш-значения всех ваших пользователей.
Позвольте мне объяснить это на примере. Предположим, у вас есть 3 пользователя в вашей системе, и вы не используете солт-значение, поэтому ваша база данных будет выглядеть так:
user1: hash1
user2: hash2
user3: hash3
Теперь давайте предположим, что злоумышленник добивается получения копии вашей базы данных. Теперь он мог выполнить атаку по словарю, выполнив:
h = hash(possible_password)
h == hash1?
h == hash2?
h == hash3?
Итак, он мог проверить, есть ли у одного из 3 пользователей пароль possible_password
, вызывая хеш-функцию только один раз.
Нет, предположим, что вы сохранили хеш-значения, которые были объединены с солт-значениями, в вашей базе данных следующим образом:
user1: hash1_salted, salt1
user2: hash2_salted, salt2
user3: hash3_salted, salt3
И снова злоумышленник копирует вашу базу данных. Но теперь, чтобы увидеть, используется ли possible_password
одним из 3 пользователей, он должен выполнить следующие проверки:
hash(possible_password + salt1) == hash1_salted?
hash(possible_password + salt2) == hash2_salted?
hash(possible_password + salt3) == hash3_salted?
Как вы видите, в этом случае злоумышленник замедляется в 3 раза (количество пользователей в вашей системе), поскольку он должен хэшировать 3 разные строки. Это общая идея, лежащая в основе значений соли, вы можете прочитать больше в wikipedia .
Но в вашем случае соль слишком большая. То, что вы хотите предотвратить, - это 2 разных пользовательских хеша, которые имеют одинаковое значение соли Так, например, соль длиной 2 бита, вероятно, не будет хорошей идеей (для более чем 4 пользователей будет уверен, что 2 имеют одинаковое значение соли). В любом случае, солт-значения более чем 48 бит будет достаточно.
Кроме того, здесь нет смысла хешировать соль $salt2 = hash('sha256', $salt);
, это может как-то замедлить процесс, но в целом добавление большей сложности в вашу систему считается плохим при работе с безопасностью.
Общее
Наконец, никогда не стоит иметь конкретные значения в своем коде при работе с безопасностью, например $secret_server_hash
, таких постоянных значений всегда следует избегать.
Лучше использовать SHA-2 вместо MD5, потому что в последние годы в MD5 были обнаружены некоторые уязвимости безопасности (хотя они пока не очень практичны).
Так что я бы сделал что-то вроде этого:
function createSalt()
{
$string = hash('sha256', uniqid(rand(), true));
return susbstr($string, 0, 8); // 8 characters is more than enough
}
$salt = createSalt();
$hash = hash('sha256', $hash . $password );
А затем сохраните $hash
в своей базе данных.
Во всяком случае, как уже отмечали некоторые пользователи. Вместо того, чтобы создавать свои собственные функции безопасности (что является хорошим способом узнать о безопасности), вы должны лучше использовать известные библиотеки, которые тестируются большим количеством людей и, следовательно, возможно, более безопасны. В вашем случае вы должны взглянуть на crypt
, который делает то, что вам нужно.