4

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

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

从提琴手:

在此处输入图像描述

存储在数据库中的密码:

!Qoc6uEP5h0lOXIeqmSov1HWOL8eY4fmlpJ1Z3q

如何应用哈希 SHA256?

注意:站点部署在 Apache2.4、Windows server 2008 r2 上。

4

2 回答 2

1

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

import hashlib
HashedPassword =hashlib.sha1('PASSWORD'.encode('UTF-8'))
于 2020-02-17T08:59:09.687 回答
0

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

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

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


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

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

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

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

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

于 2020-02-23T21:21:47.633 回答