Nomad
Oct. 12, 2020, 11:54 p.m.

Как использовать свой алгоритм хэширования пароля в Django?

bcrypt, django

всем привет

у меня вопрос по поводу метода хранения пароля в джанго.
по умолчанию джанго ставит алгоритм pbkdf2_sha256
в документации написанно что есть еше 2 алгоритма, меня интересует bcrypt
НО когда меняешь на bcrypt то джанго ставит work factor = 12
моя задача поменять на work factor = 15

в django.contrib.auth есть hashers.py а в нем class BCryptSHA256PasswordHasher(BasePasswordHasher):

в данном классе прописан фактор: rounds = 12

знает кто как переопределить данное значение???

2

Do you like it? Share on social networks!

5
Илья Чичак
  • Oct. 13, 2020, 12:45 a.m.
  • The answer was marked as a solution.

1) а чем не устроил стандартный алгоритм? (мне реально просто интересно=))
2) наследуешься от этого класса, переопределяешь классовую переменную на 15 и указываешь свой класс в качестве хешера

  1. # utils/hashers.py
  2.  
  3. class MyBCryptSHA256PasswordHasher(MyBCryptSHA256PasswordHasher):
  4. rounds = 15
  5.  
  6.  
  7. # settings.py
  8.  
  9. PASSWORD_HASHERS = [
  10. 'utils.hashers.MyBCryptSHA256PasswordHasher',
  11. 'django.contrib.auth.hashers.Argon2PasswordHasher',
  12. 'django.contrib.auth.hashers.PBKDF2PasswordHasher',
  13. 'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
  14. ]
  15.  
    Илья Чичак
    • Oct. 13, 2020, 12:48 a.m.

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

      Nomad
      • Oct. 13, 2020, 2:18 a.m.

      спасибо за решение.

        Nomad
        • Oct. 13, 2020, 7:56 p.m.
        • (edited)

        привет

        если честно это просто мой интерес, а появился вопрос после того как я где то в нете прочитал что во первых bcrypt это надежнее а если фактор 15 ТО у брудфорсеров нету никакого шанса

        да и по сути не важно, я просто задался вопросом )
        и спасибо вам за ответ

          Илья Чичак
          • Oct. 13, 2020, 9:15 p.m.
          • (edited)

          кстати, про брутфорс:
          никакой из алгоритмов не спасет от него
          пароли в Django шифруются не для того, чтобы их нельзя было подобрать, а для того, чтобы злоумышленник не смог ничего сделать с базой данных, если вдруг она оказалась у него в руках
          все пароли - хэшированны односторонней функцией сколько-то там тысяч раз с использованием соли
          провернуть фарш назад - шансов нет никаких

          при авторизации, когда пользователь ввел пароль, присходит следующее:
          1) ищется пользователь по email (если не нашелся - отбой)
          2) берется хэш пароля этого пользователя и из него берется алгоритм, соль, количество преобразований
          3) введеный пароль хэшируется тем же алгоритмом, с той же солью, столько же раз
          4) хэши сравниваются (не совпали - отбой)

          самый важный момент в плане безопасности django:
          если пользователь не нашелся - всеравно будет взят хэш от введеного пароля, чтобы нельзя было по времени ответа подобрать login-ы, которые уже есть (хэширование 30 000 раз - не самая быстрая операция, которая еще и выполняется на процессоре)
          без этого, если login уже есть, сервер отвечал бы на сколько-то миллисекунд дольше
          а уже к выявленным логинам можно применить брутфорс, от которого шифрованием защититься нельзя
          брутфорс подбор пароля можно предотвратить, сделав что-то типа 3 попытки логина и если все попытки не удачные, постепенно увеличивать задержку во времени между попытками

          про второй шаг:
          исключительно для обратной совместимости, поскольку раз во сколько то версий разработчики Django могут увеличить количество итераций или ввести и сделать по-умолчанию новый алгоритм, и чтобы твои уже существующие пароли не превратились в тыкву - типа старые пароли проверяются старым алгоритмом, новые - новым, и никто ничего не заметил

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

          главное, в продакшене не менять SECRET_KEY - он тоже используется в хэшировании паролей + генерация кук (и если куки - не так страшны, то отвалившиеся пароли - штука печальная)

            Comments

            Only authorized users can post comments.
            Please, Log in or Sign up
            • Last comments
            • AK
              April 1, 2025, 11:41 a.m.
              Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
            • Evgenii Legotckoi
              March 9, 2025, 9:02 p.m.
              К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
            • VP
              March 9, 2025, 4:14 p.m.
              Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
            • ИМ
              Nov. 22, 2024, 9:51 p.m.
              Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
            • Evgenii Legotckoi
              Oct. 31, 2024, 11:37 p.m.
              Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup