繁体   English   中英

如何在 Django LDAP 登录中应用哈希 SHA256?

[英]How to apply hashing SHA256 on Django LDAP login?

我在 Django 中使用LDAP身份验证,如下所示,还使用密码哈希。

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"
}

但是,我的凭据以纯文本形式传输。

来自提琴手:

在此处输入图片说明

存储在数据库中的密码:

!Qoc6uEP5h0lOXIeqmSov1HWOL8eY4fmlpJ1Z3q

如何应用散列SHA256?

注:本站部署于Apache2.4,Windows server 2008 r2。

如果您需要哈希密码,请尝试以下操作:

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

tl;dr:这个问题是基于一个误解。 客户端哈希提高安全性,因此不支持。

如果客户端对密码进行散列,散列将扮演密码的角色:拦截流量的人可以看到散列,并在以后使用它进行身份验证。

这是客户端不散列密码的主要原因。 为了在传输过程中保护您的密码,请使用 TLS(但您似乎已经拥有了)。


更一般地说,密码是由一方(通常是客户端,在注册帐户时)选择的对称密钥。 使用这种类型的机密进行身份验证时,无法避免在某些时候传输它。 解决这个问题的唯一方法是:

  1. 不允许任何一方选择秘密; 相反,同意一个秘密。 这称为“密钥交换”。 一种众所周知的方法是Diffie-Hellman 密钥交换 在这种情况下,尽管双方都知道密钥本身,但永远不会传输它。 (但是请注意,这对身份验证没有帮助,因为它不会告诉您与谁就密钥达成一致;它仅有助于建立一次性会话加密密钥。)
  2. 不要使用对称密钥,而是使用由私钥和公钥组成的密钥对。 然后,您可以在不影响安全性的情况下传输公钥,并采用另一种身份验证方案(例如,服务器可以要求客户端签署质询;如果成功,服务器可以推断出客户端拥有私钥,而无需要求服务器拥有它)。

如您所见,这两种方法都增加了很多额外的复杂性,而且它们通常都不适合直接最终用户身份验证。

同样,客户端散列也增加了比乍一看更复杂的复杂性。 开放性问题包括,例如,使用哪种盐,如何传输盐等。 同样,即使回答了这些问题并实施了一些复杂的解决方案,传输的哈希值仍然会允许中间人攻击者通过简单地重用散列来模拟客户端。

总而言之,客户端散列不是安全改进,避免对称秘密(双方都知道)或避免秘密传输的替代方案也不能解决问题。 因此,最先进的解决方案是将用户的密码实际传输到服务器,并封装在 TLS 连接中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM