Как применить хеширование SHA256 при Django входе в LDAP? - PullRequest
4 голосов
/ 14 февраля 2020

Я использую LDAP аутентификацию в Django, как показано ниже, а также хэши паролей.

from django_auth_ldap.config import PosixGroupType, LDAPSearch
import ldap

PASSWORD_HASHERS = [
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
    'django.contrib.auth.hashers.Argon2PasswordHasher',
    'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
]

# We use a dedicated user to bind to the LDAP server and execute the server.
AUTH_LDAP_SERVER_URI = "ldap://xx.xx.xx.xx:389"
AUTH_LDAP_BIND_DN = "xxxxx@xxxx.com"
AUTH_LDAP_BIND_PASSWORD = "xxxxx"
AUTH_LDAP_CONNECTION_OPTIONS = {
    ldap.OPT_DEBUG_LEVEL: 1,
    ldap.OPT_REFERRALS: 0,
}

# sAMAccountName is mostly used for Micrsoft Active Directory
# objectCategory    CN=Person,CN=Schema,CN=Configuration,DC=corp,DC=xxxx,DC=com
# (cn=%(user)s)
AUTH_LDAP_USER_SEARCH = LDAPSearch("DC=corp,DC=xxxxx,DC=com", 
                                    ldap.SCOPE_SUBTREE, 
                                    "(&(objectClass=user)(sAMAccountName=%(user)s))")

AUTH_LDAP_USER_ATTR_MAP = {
    "first_name": "givenName",
    "last_name": "sn",
    "email": "mail"
}

Но мои учетные данные передаются в виде простого текста.

От Fiddler:

enter image description here

Пароль хранится в БД:

!Qoc6uEP5h0lOXIeqmSov1HWOL8eY4fmlpJ1Z3q

Как применить хеширование SHA256 ?

Примечание: Сайт был развернут на Apache2.4, Windows server 2008 r2.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2020

tl; dr: Этот вопрос основан на недоразумении. Хеширование на стороне клиента не повышает безопасность и поэтому не поддерживается.

Если у клиента будет sh пароль, ha sh будет выполнять роль пароля: Кто-то, кто перехватывает трафик c, может увидеть ha sh и использовать его позже для аутентификации.

Это главная причина, по которой у клиентов нет sh паролей. Чтобы защитить ваш пароль во время транспортировки, используйте TLS (но, похоже, что он у вас уже есть).


В общем, пароль - это ключ симметричный c, который выбирается одной стороной (обычно клиент, при регистрации аккаунта). При использовании этого типа секрета для аутентификации невозможно избежать его передачи в какой-то момент. Единственные способы обойти это:

  1. Не позволяйте ни одной стороне выбрать секрет; вместо этого согласен на секрет. Это называется «обмен ключами». Один известный метод - обмен ключами Диффи-Хеллмана . В этом случае сам ключ никогда не передается, хотя обе стороны знают это. (Однако обратите внимание, что это не помогает при аутентификации, поскольку не говорит вам, с кем вы соглашаетесь с ключом; это только помогает установить sh одноразовый ключ шифрования сеанса.)
  2. Не используйте симметричные c ключи, но используйте пару ключей, состоящую из частного и открытого ключа c. Затем вы можете передать ключ publi c без ущерба для безопасности и использовать другую схему аутентификации (например, сервер может попросить клиента подписать запрос; в случае успеха сервер может сделать вывод, что клиент владеет частным ключ, без необходимости иметь его на сервере).

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

Аналогично, хеширование на стороне клиента также добавляет гораздо больше сложности, чем может показаться на первый взгляд. Открытые вопросы включают, например, какую соль использовать, как передать соль et c. И снова, даже если на эти вопросы ответят и какое-то сложное решение будет реализовано, передаваемый ha sh все же позволит злоумышленнику «посередине» выдать себя за клиента, просто повторно используя ha sh.

В общем, хеширование на стороне клиента не является улучшением безопасности, и альтернативы, которые избегают симметричных секретов c (известных обеим сторонам) или избегают секретной передачи, также не решают проблему. Таким образом, современное решение заключается в том, чтобы фактически передавать пароль пользователя на сервер, заключенный в соединение TLS.

0 голосов
/ 17 февраля 2020

Если вам нужен ха sh, введите ваш пароль:

import hashlib
HashedPassword =hashlib.sha1('PASSWORD'.encode('UTF-8'))
...