当前位置: 代码网 > it编程>前端脚本>Python > Python Django登录密码加密方案全解析

Python Django登录密码加密方案全解析

2026年08月17日 Python 我要评论
前言搭建django后台、用户登录系统时,几乎所有人都会遇到同一个问题:用户密码如何存储?不少新手直接使用md5、sha256简单哈希,或者自己手写加盐逻辑,上线后埋下严重安全隐患。django本身内

前言

搭建django后台、用户登录系统时,几乎所有人都会遇到同一个问题:用户密码如何存储?

不少新手直接使用md5、sha256简单哈希,或者自己手写加盐逻辑,上线后埋下严重安全隐患。

django本身内置完善的密码认证体系,但很多开发者不理解底层原理,随意替换加密算法,造成安全降级、密码迁移、前后端兼容等一系列问题。

本文围绕django登录、用户密码存储场景,讲清楚各类哈希算法优劣、django原生机制、最佳实践、避坑要点,附带可直接落地的配置代码。

适用范围:django3.2 / 4.2 / 5.x,web后台登录、api接口登录、admin后台用户体系。

一、先理清核心原则:登录密码不能用什么?

绝对不推荐

  1. md5:已被破解,存在大量彩虹表,仅适合文件校验,严禁存储密码。
  2. sha1 / sha256 / sha512(单纯哈希、固定加盐):属于快速哈希算法,gpu可以暴力穷举。哪怕自定义salt,迭代次数只有1次,抵御暴力 破解能力极差。
  3. 自己手写加盐sha:容易出现编码错误、salt管理混乱、迭代次数不足、随机盐丢失等问题,安全性远低于成熟算法。

适合密码存储的算法特征

密码哈希算法必须满足:

  1. 慢速哈希:计算耗时可控,大幅降低暴力 破解速度;
  2. 自动随机盐:每条密码使用独立随机盐,防止彩虹表批量破解;
  3. 可配置迭代次数:硬件性能提升后可以调高迭代轮数;
  4. 输出字符串自带算法标识、盐、迭代参数,方便后续升级迁移。

二、django 内置支持哪些密码算法?

django django.contrib.auth 原生支持多种密码哈希器,配置项位于 settings.pypassword_hashers

默认优先级顺序(django4.x/5.x):

password_hashers = [
    'django.contrib.auth.hashers.argon2passwordhasher',
    'django.contrib.auth.hashers.pbkdf2passwordhasher',
    'django.contrib.auth.hashers.pbkdf2sha1passwordhasher',
    'django.contrib.auth.hashers.bcryptsha256passwordhasher',
    'django.contrib.auth.hashers.scryptpasswordhasher',
]

逐个解读:

  1. argon2passwordhasher(首选推荐):argon2 是密码哈希竞赛获胜算法,抵抗gpu、asic暴力 破解能力最强,内存开销高,很难大规模并行爆破。
  2. pbkdf2passwordhasher(django历史默认方案,兼容性最强):基于hmac-sha256,稳定、部署无额外依赖,服务器资源紧张场景首选。
  3. bcryptsha256passwordhasher:经典老牌算法,注意原生bcrypt存在72字节长度限制,django封装版先sha256预处理规避限制。
  4. scryptpasswordhasher:和argon2思路类似,高内存消耗,适合硬件资源充足服务器。

重点:django不会简单保存哈希字符串,数据库存储格式示例:argon2$v=19$m=102400,t=8,p=2$xxxx随机盐$xxxx摘要

字符串内置:算法版本、内存参数、迭代次数、并行度、随机盐、哈希结果,后期平滑升级无需迁移旧密码。

三、方案选型对比(django登录场景)

算法安全性依赖服务器资源消耗适用场景
argon2⭐⭐⭐⭐⭐需要安装argon2-cffi中等偏高新项目首选,服务器cpu内存充足
pbkdf2(sha256)⭐⭐⭐⭐无第三方依赖,python内置较低老旧服务器、容器资源受限、不想额外安装包
bcryptsha256⭐⭐⭐⭐需要bcrypt库中等老项目迁移,团队熟悉bcrypt
scrypt⭐⭐⭐⭐⭐需要scrypt库硬件富余,对安全要求极高的内部系统
sha256自定义加盐无依赖极低禁止用于密码存储

四、落地配置教程

方案1:新项目首选 argon2

安装依赖

pip install argon2-cffi

settings.py 配置,将argon2放在第一位(新建用户默认使用首位哈希器)

password_hashers = [
    'django.contrib.auth.hashers.argon2passwordhasher',
    'django.contrib.auth.hashers.pbkdf2passwordhasherher',
    'django.contrib.auth.hashers.pbkdf2sha1passwordhasher',
    'django.contrib.auth.hashers.bcryptsha256passwordhasher',
]

# 可选:调整argon2参数(内存、迭代次数,越高越安全、越耗cpu)
# 一般默认参数足够业务使用,不要盲目调太高引发接口超时

方案2:不想安装第三方库,使用 pbkdf2(零依赖)

无需额外安装包,直接配置:

password_hashers = [
    'django.contrib.auth.hashers.pbkdf2passwordhasher',
    'django.contrib.auth.hashers.argon2passwordhasher',
    'django.contrib.auth.hashers.bcryptsha256passwordhasher',
]

五、django 密码自动升级机制(非常重要)

很多人不知道django自带密码平滑升级能力:

当系统password_hashers首位算法更新后:

  1. 用户登录时,使用旧算法校验密码;
  2. 校验成功后,自动使用新算法重新哈希,更新数据库password字段;
  3. 无需一次性批量迁移全部历史数据,用户登录时渐进升级。

这是自研哈希方案很难实现的优势。

六、在django视图/api中手动校验密码(前后端分离场景)

如果你使用前后端分离,不依赖loginview,手动实现登录逻辑:

from django.contrib.auth import authenticate
from django.contrib.auth.hashers import make_password, check_password
from django.http import jsonresponse

def login_api(request):
    if request.method == "post":
        username = request.post.get("username")
        password = request.post.get("password")
        
        # 方式1:标准authenticate(推荐,兼容user模型、自动哈希校验)
        user = authenticate(username=username, password=password)
        if user:
            # 登录成功,生成session或token
            return jsonresponse({"code": 0, "msg": "登录成功"})
        else:
            return jsonresponse({"code": -1, "msg": "账号或密码错误"})

手动生成密码(创建用户、重置密码场景)

from django.contrib.auth.hashers import make_password

raw_pwd = "123456"
pwd_hash = make_password(raw_pwd)
print(pwd_hash)
# 直接存入user.password字段

手动校验密码(已有hash字符串场景)

from django.contrib.auth.hashers import check_password

ok = check_password("原始密码", db_password_hash)

禁止做法:不要自己拼接盐+密码调用hashlib.sha256,不要覆盖make_password底层逻辑。

七、配套安全策略(光选加密算法远远不够)

开启密码复杂度校验

# settings.py
auth_password_validators = [
    {
        'name': 'django.contrib.auth.password_validation.userattributesimilarityvalidator',
    },
    {
        'name': 'django.contrib.auth.password_validation.minimumlengthvalidator',
        'options': {
            'min_length': 8,
        }
    },
    {
        'name': 'django.contrib.auth.password_validation.commonpasswordvalidator',
    },
    {
        'name': 'django.contrib.auth.password_validation.numericpasswordvalidator',
    },
]

登录接口限流,防止暴力猜密码:结合django-ratelimit或者自定义限流,限制同一ip短时间登录失败次数。

https 强制开启:原始密码在网络明文传输,哈希再安全也无意义。

不要在日志打印原始密码、不要传输明文哈希给前端。

八、高频踩坑清单

坑1:混淆「数据签名哈希」和「密码哈希」

接口签名、文件校验可以用sha256;用户登录密码不能直接sha256,两者设计目标完全不同。

坑2:前后端分离项目,前端先加密再传给后端

错误思路:前端sha256加密密码传到后端

攻击者抓包拿到哈希值,即可直接使用哈希登录,等同于明文。

正确:前端传递原始密码(https),后端做哈希处理。

坑3:随意更换password_hashers顺序,旧用户无法登录

不要直接删除旧哈希器,只能把新算法放最前面,旧算法保留在列表用于兼容历史密码。

坑4:自行存储盐字段

django哈希字符串内置随机盐,不需要单独建字段保存salt,不要重复造轮子。

坑5:argon2安装失败

部分国内环境pip安装argon2-cffi容易出错,资源受限服务器直接选用pbkdf2规避依赖问题。

九、新旧系统迁移方案

如果老项目密码使用md5/sha256存储:

  1. password_hashers末尾添加自定义哈希器兼容旧密码;
  2. 用户登录校验通过后,自动用新算法重写密码;
  3. 等待大部分用户完成登录迁移,下线旧算法。

总结

  1. django登录密码存储优先选用argon2;服务器无法安装依赖,选择pbkdf2sha256;
  2. 绝对不要手写sha256+固定盐用于用户密码;
  3. 优先使用django内置make_passwordcheck_passwordauthenticate,不要重复造轮子;
  4. 利用django原生哈希器特性,实现密码平滑升级;
  5. 密码哈希只是安全一环,必须配套https、登录限流、密码复杂度策略。

只要遵循这套方案,不管是django admin后台、传统模板登录,还是前后端分离jwt登录,都可以满足企业级安全标准。

到此这篇关于python django登录密码加密方案全解析的文章就介绍到这了,更多相关django登录密码内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com