Как изменить мои старые пароли sha1 на значения sha256 или Bcrypt в поле базы данных - PullRequest
0 голосов
/ 05 апреля 2019

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

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

sha1 дает

46ebaaa2b80c7a3459b80353e085aaeed5aff2ff

sha256 дает

f7b3781c5eafc2779a96bae2e4875a83ecce46f198e9f81916521d9d218c7da7

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

Ответы [ 2 ]

2 голосов
/ 05 апреля 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 true , возьмите bcrypt(sha1("plain_text_pwd")) и сравните его с одним хранилищем в БД.Если он совпадает, сохраните bcrypt("plain_text_pwd"), установите legacy_pwd в false и войдите в систему.

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


Последующие действия и очистка

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

0 голосов
/ 05 апреля 2019

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

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

...