django - 如何对 Django 说不要散列用户密码?
问题描述
我的用户模型是django.contrib.auth.models.User
. 默认情况下,它使用PBKDF2
算法来加密密码,所以我在数据库中看到密码的哈希值。有没有办法关闭加密以便我可以读取密码?
我知道这通常不是一个好习惯。我有这个目的是因为我在前端级别加密密码并通过 REST 框架传递哈希值。它们应该用于检查签名和执行其他加密操作,因此我需要自己传递的密码,并且我不想创建自定义用户模型或相关的一对一模型来将哈希存储在单独的某处的场。
Django 版本:3.0.5
我也尝试过像这样实现我自己的哈希:
# app/hashers.py
from django.contrib.auth.hashers import BasePasswordHasher
class EmptyPasswordHasher(BasePasswordHasher):
algorithm = 'empty'
def verify(self, password, encoded):
"""Check if the given password is correct."""
print(password, encoded)
return password == encoded
def encode(self, password, salt):
return password
def safe_summary(self, encoded):
return {
_('algorithm'): self.algorithm,
}
我的settings.py
:
# settings.py
PASSWORD_HASHERS = [
"app.hashers.EmptyPasswordHasher",
]
不幸的是,它没有帮助。根据这里的源代码https://github.com/django/django/blob/master/django/contrib/auth/hashers.py
,函数check_password
调用identify_hasher
之前需要传递的编码密码具有算法名称$
。因此,实施的EmptyPasswordHasher
alwawsFalse
在检查时返回,这是错误的。
解决方案
正如您自己所说,这是一个坏主意,因为如果有人在您的网站上使用与在另一个网站上相同的密码,那么如果您被黑客入侵,您实际上就有泄露另一个网站密码的风险。这是一个很大的责任。
也就是说,我知道可能存在上述不适用的特定情况,或者当您确定没有人从另一个站点重复使用他们的密码时。
Django 通过查看PASSWORD_HASHERS 设置来决定应该使用哪种方法来散列密码。可以编写您自己的密码哈希并在您的设置中引用它。
哈希器使用在django.hashers中找到的签名,所以也许您可以编写自己的哈希器,只返回密码?
推荐阅读
- java - 如何正确抛出运行时异常并重启 docker 容器
- javascript - 变量值更新将值更改为 null
- javascript - 如何将 ECDH 密钥对的原始表示形式转换为 JSON Web 密钥?
- odoo - 安装模块后正常字段没有更新吗?
- c# - 如何在 NPOI 中使用系统颜色设置 excel 单元格背景颜色
- python-3.x - 为什么我在 pennylane 中收到设备功能的“TypeError”?
- spring-kafka - 使用 DeadLetterPublishingRecoverer 进行状态重试导致 RetryCacheCapacityExceededException
- vue.js - Facebook 登录错误:“FB”未使用 Vue.js 定义
- php - 在php中查询和排序数据
- javascript - 如何检查元素数组中选中复选框的数量?