默认情况下,在 Django 中启用强密码哈希(bcrypt+hmac 或 SHA-2)。
项目描述
Django 的强密码哈希
==================================
这是 Django 的猴子补丁,添加强密码默认情况下使用散列
。
开始
---------------
使用 ``easy_install`` 或 ``pip`` 安装此应用程序,并通过将
以下内容添加到您的 ``settings.py`` 文件来启用它:
INSTALLED_APPS = (
# ...
'django.contrib.auth',
'django_sha2', # 在 auth 后加载以对其进行猴子补丁。
# ...
)
PWD_ALGORITHM = 'bcrypt' # 其中之一:bcrypt、sha512、sha512b64、 sha256
BCRYPT_ROUNDS = 12 # 可选。12 是默认值。只需要 bcrypt。
将以下内容添加到您的“settings_local.py”文件中,并
对其保密:
HMAC_KEYS = {
'2011-01-01': 'ThisisASharedKey',
'2010-06-01': 'OldSharedKey',
'2010 -01-01': 'EvenOlderSharedKey'
}
``HMAC_KEYS`` 是一个字典``{key-id: shared-secret}``。您只需一
键即可启动。字典键可以是 ISO 日期,或几乎任何其他内容,
但最新的键将通过排序确定。
**注意:** 如果您没有 ``settings_local.py`` 文件或类似文件,请确保
在 ``settings.py`` 末尾使用 ``from settings_local import *`` 并添加
它到您的版本控制系统的忽略文件,因此它成为
您的 Django 设置,但未提交到存储库。
此更改是向后兼容的(即,
数据库中现有的 SHA-1 散列继续工作),并且不需要更改数据库\*。
\*:除非您使用的是 SHA-512(见下文)。
默认值:Bcrypt 和 HMAC
----------------------------
默认哈希算法的快速概览:它使用 Bcrypt 和 HMAC 的
组合带有 SHA-512 的 HMAC。[HMAC][hmac] 是一个涉及
使用密钥的散列函数——您在上面输入的“HMAC_KEYS”将用于
计算。
计算中涉及机器本地机密的原因是,
如果攻击者获得对数据库的访问权,那么数据将毫无用处
_also_ 获得了文件系统访问权限以窃取本地机密。
``HMAC_KEYS`` 是一个字典,因此您可以定期更改密钥
并弃用旧密钥,或者完全撤销太旧或您
担心可能泄露的密钥。
其次,使用 [bcrypt][bcrypt] 再次对哈希进行哈希处理,这在
计算上很困难,因此可以更好地防止暴力离线
攻击。
[hmac]:http://en.wikipedia.org/wiki/HMAC
[bcrypt]:http://bcrypt.sourceforge.net/
透明密码重散列
---------------- --------------
如果您在数据库中有现有用户的密码散列较弱(如 SHA-1)
,django\_sha2 将在
下次登录时使用您当前选择的哈希算法的数据库。
这是默认启用的。如果您不喜欢它,请在您的设置
文件中设置:
PWD_REHASH = False
同样,django\_sha2 会
在登录时自动将用户的密码哈希更新为**最新的 HMAC 密钥**,这通常是您想要的,所以它默认启用
。要禁用,请设置此设置:
PWD_HMAC_REKEY = False
关于 SHA-512 的注释
-----------------
Django 的默认密码字段限制为 128 个字符,不
适合十六进制-编码的 SHA512 哈希。为了不需要
为每个使用它的项目进行数据库迁移,我们将 Base 64 中的 SHA512 哈希编码为
反对十六进制。要使用它,请将您的哈希后端设置如下:
PWD_ALGORITHM = 'sha512b64'
如果您想使用十六进制编码的 SHA512,请使用以下命令:
PWD_ALGORITHM = 'sha512'
但是,请注意,您需要确保数据库的密码字段
至少可以容纳 156 个字符。
开始一个新项目时,直接使用 Sha512 后端是安全的: django\_sha2 将在第一次运行 ``
syncdb`` 时创建 ``max_length`` 为 255 的密码字段。历史--------这开始是作为 Django 中 SHA-256 的猴子补丁,在 SHA-512 之上,变成了一个强大的散列库,具有 bcrypt 和 hmac 支持。
对于最初的想法,请阅读关于它的 [blog post][blog]。
[博客]:http://fredericiana.com/2010/10/12/adding-support-for-stronger-password-hashes-to-django/
使用 django 1.4
-------
Django 1.4 允许我们创建我们自己的密码哈希。由于
django 模型的一些设计选择,我们必须为每个 HMAC_KEYS 生成一个哈希类
。幸运的是,我们有代码可以帮助您!为您可能用来解密数据库中某些内容的所有哈希器定义
BASE_PASSWORD_HASHERS
(即,如果您过去使用过 SHA256,请确保它在此
设置中)。在那里形成,如果您按照下面的代码,您的所有密码将
自动与最新的 algorthim/hmac_key 保持同步。
这是一个示例设置文件片段:
```python
HMAC_KEYS = {
'2010-06-01': 'OldSharedKey',
'2011-01-01': 'ThisisASharedKey',
'2010-01-01': 'EvenOlderSharedKey'
}
BASE_PASSWORD_HASHERS = (
'django_sha2.hashers.BcryptHMACCombinedPasswordVerifier',
'django_sha2.hashers.SHA512PasswordHasher',
'django_sha2.hashers.SHA256PasswordHasher',
'django.contrib.auth.hashers.SHA1PasswordHasher',
'django.contrib.auth.hashers.MD5PasswordHasher.MD5PasswordHasher ' ',
'django.contrib.auth.hashers.UnsaltedMD5PasswordHasher',
)
从 django_sha2 导入 get_password_hashers
PASSWORD_HASHERS = get_password_hashers(BASE_PASSWORD_HASHERS, HMAC_KEYS)
```
==================================
这是 Django 的猴子补丁,添加强密码默认情况下使用散列
。
开始
---------------
使用 ``easy_install`` 或 ``pip`` 安装此应用程序,并通过将
以下内容添加到您的 ``settings.py`` 文件来启用它:
INSTALLED_APPS = (
# ...
'django.contrib.auth',
'django_sha2', # 在 auth 后加载以对其进行猴子补丁。
# ...
)
PWD_ALGORITHM = 'bcrypt' # 其中之一:bcrypt、sha512、sha512b64、 sha256
BCRYPT_ROUNDS = 12 # 可选。12 是默认值。只需要 bcrypt。
将以下内容添加到您的“settings_local.py”文件中,并
对其保密:
HMAC_KEYS = {
'2011-01-01': 'ThisisASharedKey',
'2010-06-01': 'OldSharedKey',
'2010 -01-01': 'EvenOlderSharedKey'
}
``HMAC_KEYS`` 是一个字典``{key-id: shared-secret}``。您只需一
键即可启动。字典键可以是 ISO 日期,或几乎任何其他内容,
但最新的键将通过排序确定。
**注意:** 如果您没有 ``settings_local.py`` 文件或类似文件,请确保
在 ``settings.py`` 末尾使用 ``from settings_local import *`` 并添加
它到您的版本控制系统的忽略文件,因此它成为
您的 Django 设置,但未提交到存储库。
此更改是向后兼容的(即,
数据库中现有的 SHA-1 散列继续工作),并且不需要更改数据库\*。
\*:除非您使用的是 SHA-512(见下文)。
默认值:Bcrypt 和 HMAC
----------------------------
默认哈希算法的快速概览:它使用 Bcrypt 和 HMAC 的
组合带有 SHA-512 的 HMAC。[HMAC][hmac] 是一个涉及
使用密钥的散列函数——您在上面输入的“HMAC_KEYS”将用于
计算。
计算中涉及机器本地机密的原因是,
如果攻击者获得对数据库的访问权,那么数据将毫无用处
_also_ 获得了文件系统访问权限以窃取本地机密。
``HMAC_KEYS`` 是一个字典,因此您可以定期更改密钥
并弃用旧密钥,或者完全撤销太旧或您
担心可能泄露的密钥。
其次,使用 [bcrypt][bcrypt] 再次对哈希进行哈希处理,这在
计算上很困难,因此可以更好地防止暴力离线
攻击。
[hmac]:http://en.wikipedia.org/wiki/HMAC
[bcrypt]:http://bcrypt.sourceforge.net/
透明密码重散列
---------------- --------------
如果您在数据库中有现有用户的密码散列较弱(如 SHA-1)
,django\_sha2 将在
下次登录时使用您当前选择的哈希算法的数据库。
这是默认启用的。如果您不喜欢它,请在您的设置
文件中设置:
PWD_REHASH = False
同样,django\_sha2 会
在登录时自动将用户的密码哈希更新为**最新的 HMAC 密钥**,这通常是您想要的,所以它默认启用
。要禁用,请设置此设置:
PWD_HMAC_REKEY = False
关于 SHA-512 的注释
-----------------
Django 的默认密码字段限制为 128 个字符,不
适合十六进制-编码的 SHA512 哈希。为了不需要
为每个使用它的项目进行数据库迁移,我们将 Base 64 中的 SHA512 哈希编码为
反对十六进制。要使用它,请将您的哈希后端设置如下:
PWD_ALGORITHM = 'sha512b64'
如果您想使用十六进制编码的 SHA512,请使用以下命令:
PWD_ALGORITHM = 'sha512'
但是,请注意,您需要确保数据库的密码字段
至少可以容纳 156 个字符。
开始一个新项目时,直接使用 Sha512 后端是安全的: django\_sha2 将在第一次运行 ``
syncdb`` 时创建 ``max_length`` 为 255 的密码字段。历史--------这开始是作为 Django 中 SHA-256 的猴子补丁,在 SHA-512 之上,变成了一个强大的散列库,具有 bcrypt 和 hmac 支持。
对于最初的想法,请阅读关于它的 [blog post][blog]。
[博客]:http://fredericiana.com/2010/10/12/adding-support-for-stronger-password-hashes-to-django/
使用 django 1.4
-------
Django 1.4 允许我们创建我们自己的密码哈希。由于
django 模型的一些设计选择,我们必须为每个 HMAC_KEYS 生成一个哈希类
。幸运的是,我们有代码可以帮助您!为您可能用来解密数据库中某些内容的所有哈希器定义
BASE_PASSWORD_HASHERS
(即,如果您过去使用过 SHA256,请确保它在此
设置中)。在那里形成,如果您按照下面的代码,您的所有密码将
自动与最新的 algorthim/hmac_key 保持同步。
这是一个示例设置文件片段:
```python
HMAC_KEYS = {
'2010-06-01': 'OldSharedKey',
'2011-01-01': 'ThisisASharedKey',
'2010-01-01': 'EvenOlderSharedKey'
}
BASE_PASSWORD_HASHERS = (
'django_sha2.hashers.BcryptHMACCombinedPasswordVerifier',
'django_sha2.hashers.SHA512PasswordHasher',
'django_sha2.hashers.SHA256PasswordHasher',
'django.contrib.auth.hashers.SHA1PasswordHasher',
'django.contrib.auth.hashers.MD5PasswordHasher.MD5PasswordHasher ' ',
'django.contrib.auth.hashers.UnsaltedMD5PasswordHasher',
)
从 django_sha2 导入 get_password_hashers
PASSWORD_HASHERS = get_password_hashers(BASE_PASSWORD_HASHERS, HMAC_KEYS)
```