Как изменить мои старые пароли sha1 на значения sha256 или Bcrypt в поле базы данных

У меня есть база данных данных, в которой столбец пароля использует значения sha1. Я планирую обновить свой метод шифрования до Bcrypt или sha256. Хотел бы получить скрипт, который обновит все пароли sha1 до значений sha256 или Bcrypt. Большое спасибо

Пример: если мой пароль хари

sha1 дает

46ebaaa2b80c7a3459b80353e085aaeed5aff2ff

sha256 дает

f7b3781c5eafc2779a96bae2e4875a83ecce46f198e9f81916521d9d218c7da7

И что поменять все sha1 на sha256


person Hariharan V.    schedule 05.04.2019    source источник
comment
Вы должны использовать password_hash() PHP вместо того, чтобы пытаться свернуть собственный алгоритм хеширования. Кроме того, вы не можете обновлять пароли самостоятельно, поскольку у вас есть только хэши, а не настоящие пароли. Я бы предложил добавить столбец в вашу таблицу: needs_rehash. Если для этого установлено значение true, когда пользователь входит в систему, то сверьтесь с текущим хэшем sha1, перефразируйте пароль с помощью password_hash() и установите для столбца needs_rehash значение false.   -  person Magnus Eriksson    schedule 05.04.2019
comment
У вас будет возможность перефразировать пароли пользователей при следующем входе в систему.   -  person cfillion    schedule 05.04.2019


Ответы (2)


Невозможно изменить значения хеша, поскольку операция хеширования необратима. То есть вы можете преобразовать обычный текст в хеш-значение, но не наоборот.
Итак, лучше было бы сделать другую таблицу для паролей sha256. И продолжайте переносить своих пользователей на другие таблицы при следующем входе в систему.
Т.е. при следующем входе пользователя в систему проверка правильности пароля из существующей таблицы. Если пользователь окажется правильным, перефразируйте пароль с помощью sha256 и сохраните его в другой (новой) таблице. Таким образом, в конечном итоге, когда пользователи входят в систему, вы можете переносить их на более безопасные хешированные пароли sha256.
После переноса пользователя вы можете удалить его записи из старой таблицы (либо в тот же момент, либо позже любым пакетным скриптом).

Теперь о том, как обращаться с логином. Это будет двухэтапный процесс, пока все пользователи не будут перенесены.
1. Сначала проверьте новую таблицу. Если все в порядке, продолжайте.
2. В противном случае проверьте старую таблицу.

person Akash Panda    schedule 05.04.2019
comment
Нет необходимости создавать новую таблицу. Просто добавьте столбец в существующую таблицу, в котором указано, нуждается ли пароль в перехешировании или нет, и если да, то при успешном входе в систему просто правильно хешируйте пароль и обновите хэш пароля в БД и установите флаг перехеширования. к ложному. - person Magnus Eriksson; 05.04.2019
comment
Да, это тоже может быть решением. Разный способ сделать одно и то же. Но ваше решение лучше. - person Akash Panda; 05.04.2019
comment
В этом случае наличие двух таблиц может создать много проблем. Пример: по какой-то причине вы хотите присоединиться к пользовательскому столу. К какой таблице вы должны присоединиться? Вы не можете присоединиться к новому, так как не все пользователи могут существовать в нем. Вы не можете присоединиться к старой таблице, так как в новой таблице могут быть обновленные данные. Кроме того, когда пользователь входит в систему, вам нужно будет сначала проверить новую таблицу, и если пользователь там не существует, вам нужно получить пользователя из старой таблицы. Это кажется довольно ненужным, поскольку вы можете решить эту проблему, просто добавив дополнительный столбец в существующую таблицу. - person Magnus Eriksson; 05.04.2019
comment
@Магнус Эрикссон: Верно. Вот почему я сказал, что ваше решение лучше. Я понял преимущества, как только вы предложили решение. - person Akash Panda; 05.04.2019

Многое было сказано в другом ответе или комментариях.

По сути, вы не можете просто перейти от значения хеширования к другому значению хеширования, соответствующему исходному значению. Хеш-функция — это односторонняя функция.

Но не бойтесь, есть надежда! Вот подход, который позволит вам:

  • Добавить новый алгоритм хеширования пароля
  • Избегайте сброса пароля всех ваших пользователей
  • Обработка устаревшего алгоритма хеширования паролей
  • Защитите устаревший пароль с помощью нового алгоритма хеширования прямо сейчас

Выбор хэш-функции

Это важно. Пожалуйста, прочитайте внимательно.

Для хранения паролей вы не должны не использовать какие-либо (криптографические) функции хэширования, такие как 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 верно, возьмите bcrypt(sha1("plain_text_pwd")) и сравните его с одним хранилищем в БД. Если он совпадает, сохраните bcrypt("plain_text_pwd"), установите для legacy_pwd значение false и войдите в систему.

Если legacy_pwd ложно, просто возьмите bcrypt("plain_text_pwd") и сравните его с одним хранилищем в БД. Если он совпадает, войдите в систему.


Последующее наблюдение и чистка

Регулярно вам нужно будет проверять, не осталось ли в legacy_pwd какого-либо значения true. Если нет (все пользователи мигрировали), вы можете удалить столбец и удалить код, обрабатывающий устаревший пароль.

person Indigo    schedule 05.04.2019