Любой пользовательский метод, который вы изобрели, с большей вероятностью содержит незначительные ошибки, которые делают ваш метод хранения уязвимым Это не стоит усилий, так как вы вряд ли найдете эти тонкие ошибки, пока не станет слишком поздно. Гораздо лучше использовать то, что было опробовано и проверено.
Как правило, это ваш выбор при сохранении пароля,
- Использование bcrypt .
- Используйте соленый, усиленный хеш.
Первый способ прост, просто используйте bcrypt. Он поддерживается практически на любом языке и широко используется и проверяется для обеспечения его безопасности.
Второй метод требует, чтобы вы использовали хеш-функцию общего назначения (семейство SHA-2 или лучше, а не MD5 или SHA-1, поскольку они сломаны / слабые ) или еще лучше, HMAC , создайте уникальную соль для пользователя и уникальную соль приложения, а затем многократно повторяйте хэш-функцию (100 000 и т. Д.), Чтобы замедлить ее (называемую растяжением / усилением ключа ) .
например. (Псевдокод)
sofar = hash("sha512", user_salt + site_salt + input_password);
iterations = 100000; // Should be changed based on hardware speed
while (iterations > 0)
{
sofar = hash("sha512", user_salt + site_salt + sofar);
iterations--;
}
user.save("password", "$sha512$" + user_salt + "$" + iterations + "$" + sofar);
Каждая итерация должна опираться на предыдущую итерацию, чтобы кто-то не мог распараллелить метод грубой силы, чтобы ее сломать. Аналогично, количество итераций должно быть изменено в зависимости от скорости вашего оборудования, чтобы процесс был достаточно медленным. Чем медленнее хэширование пароля, тем медленнее.
Краткое описание
Используйте bcrypt .