Много было сказано в других ответах или комментариях.
По сути, вы не можете просто перейти от значения хеширования к другому значению хеширования, соответствующему начальному значению.Хеш-функция - это односторонняя функция.
Но не бойтесь, надежда есть!Вот подход, который позволит вам:
- Добавить новый алгоритм хэширования пароля
- Избегать сброса пароля всех ваших пользователей
- Обрабатывать алгоритм хэширования старого пароля
- Защитите старый пароль с помощью нового алгоритма хеширования прямо сейчас
Выбор функции хеширования
Это важно.Пожалуйста, внимательно прочитайте.
Для хранения пароля вы должны , а не использовать любую (криптографическую) функцию хеширования, такую как SHA1, SHA2 или даже SHA3 (Keccak).Основная причина в том, что они быстрые.Слишком быстро.Это не то, к чему вы должны стремиться с помощью хеширования пароля Дополнительная информация .
Также они не обрабатывают засолку, что означает, что вам нужно будет сделать это вручную, что означает, что у вас больше шансов испортить его.
Для хранения пароля вам понадобится функция хеширования пароля , созданная для этой цели.У вас есть несколько хорошо известных функций: PBKDF2, BCrypt, SCrypt или Argon2.
Эти функции могут обрабатывать соли и работают медленно (а производительность настраивается с помощью параметров).
Теперь, когда выиспользуя PHP, это еще проще для вас.Функция password_hash()
дает вам хороший и рабочий BCrypt справа от летучей мыши.Используй это!
Он даже поддерживает Argon2, если вы используете PHP 7.2+.Но придерживайтесь BCrypt сейчас.Это проще и проверено в бою.
Основная проблема, которую вы будете иметь с BCrypt, - это настройка его параметра: значение cost
.Это напрямую влияет на время, необходимое для вычисления одного хеша.
По сути, это зависит от вашего сервера.Так что вам нужно провести здесь некоторый тест, начиная с стоимости по умолчанию, равной 10, и увеличиваясь до тех пор, пока для вычисления хэша не потребуется 700 мс ~ 1 с.
Я сделал этот удобный PHP-скрипт Несколько раз назад, чтобы помочь мне в этой задаче.Я также сделал один для для Argon2 , но, как вы можете видеть, он более сложный.
Кроме того, никогда не поставляйте свою собственную соль.Пусть функция справится с этим за вас (даже если вы думаете вы можете добиться большего успеха).
Реализуйте новый алгоритм хеширования пароля
Как сказано в некоторых комментарияхВаш лучший подход - добавить новый логический столбец legacy_pwd
, инициализированный как true.
EDIT : не забудьте, конечно, обновить определение таблицы относительно столбцаразмер .Дайджест SHA1 имеет размер 40 шестнадцатеричных символов (160 бит), в то время как дайджест BCrypt имеет размер 60 символов.
Кроме того, чтобы сейчас защитить существующий пароль клиента, я предлагаю вам применить новое хэширование.Функция (BCrypt) для столбца password
.
Когда пользователь пытается войти в систему со своим именем пользователя / паролем, вы сначала проверяете legacy_pwd
.
Если legacy_pwd
true , возьмите bcrypt(sha1("plain_text_pwd"))
и сравните его с одним хранилищем в БД.Если он совпадает, сохраните bcrypt("plain_text_pwd")
, установите legacy_pwd
в false и войдите в систему.
Если legacy_pwd
false , просто возьмите bcrypt("plain_text_pwd")
и сравните его содин магазин в БД.Если он совпадает, войдите в систему.
Последующие действия и очистка
Регулярно вам необходимо проверять, остается ли в legacy_pwd
какое-либо значение true
.Если нет (все пользователи мигрировали), вы можете удалить столбец и удалить код, обрабатывающий устаревший пароль.