Повторно хэшировать базу данных пользователей

Мне было интересно, есть ли способ изменить способ хеширования паролей на моем сайте. Мой друг-программист был не самым умным, когда не добавлял соли в хэш sha512. Так что теперь это очень небезопасно, и я хочу это изменить. Я думал о том, чтобы сделать какой-то сложный код для повторного хеширования, когда кто-то, у кого есть старый тип хэша, входит в систему, и он устанавливает переменную в значение true после добавления соли. Или я мог бы взять текущие хешированные пароли и каким-то образом добавить к ним соль. Я бы предпочел не сбрасывать свою базу данных пользователей, если мне это не нужно. Любая идея поможет. Я также довольно новичок в php, поэтому, пожалуйста, объясните, если вы включаете код.

Он хэшируется с использованием этого метода.

<?php hash('sha512',"passwordhere") ?>

person Darkaaja    schedule 10.09.2013    source источник
comment
меняться при каждом новом входе в систему — ваш лучший вариант; или мой предпочтительный вариант, не беспокойтесь :-), подумайте о худшем случае, у некоторых есть БД, но тогда у вас есть ваш сайт, так что игра окончена.   -  person    schedule 11.09.2013


Ответы (2)


  1. Измените свою пользовательскую таблицу, чтобы включить столбец «соль», значение по умолчанию «NULL».
  2. Alter your login code to check if the user has a salt:
    • If yes, compare the salted hashes and log in
    • If no:
      1. Compare the unsalted hashes.
      2. Создайте случайную соль.
      3. Сгенерируйте свой соленый хэш.
      4. Сохраните новую соль и хэш в базе данных.
      5. Продолжить процесс входа.

Конечно, вам также потребуется обновить свой код для регистрации, смены/восстановления пароля и т.д.

В качестве альтернативы вместо столбца «соль» вы можете поместить столбец «hash_ver» и использовать его, чтобы определить, какой метод проверки использовать и когда обновлять хэш. Таким образом, если вы хотите использовать метод хеширования, который упаковывает соль в хеш, например bcrypt, вы не застрянете, пытаясь выяснить, с каким типом хэша вы имеете дело.

person Sammitch    schedule 10.09.2013
comment
Не могли бы вы объяснить hash_ver? - person Darkaaja; 11.09.2013
comment
Я бы просто использовал беззнаковый tinyint, по умолчанию 0, и увеличивал бы его каждый раз, когда вы меняете схему хеширования. Затем вы можете добавить больше методов хеширования в будущем, и ваши функции аутентификации могут знать, какой хэш они просматривают, и нужно ли изменять хэш при входе пользователя в систему. Например. 0=SHA512, 1=SaltedSHA512, 2=bcrypt, 3=то, что заменяет bcrypt и т. д. - person Sammitch; 11.09.2013

Каждая система хранения паролей должна иметь возможность переключения на лучший алгоритм хеширования, ваша проблема не является проблемой разовой миграции. В ответе на этот вопрос я попытался указать необходимые шаги .

Примечание. Алгоритмы быстрого хэширования, такие как SHA-*, не подходят для хеширования паролей, вместо этого переключитесь непосредственно на медленную функцию получения ключей, такую ​​как BCrypt. Новая функция PHP password_hash() упростит хеширование (это сгенерировать для вас безопасную соль) и является «защитой на будущее», а также сделает возможным переключение в будущем.

person martinstoeckli    schedule 13.09.2013