Become a sponsor

说明
密码加密使用 Django 内置的 make_password 和 check_password 函数,基于 PBKDF2 算法(默认工作因子 320000 次迭代)。用户安全信息获取工具位于 utils/security.py。
Django 默认使用 PBKDF2 + SHA256 算法进行密码哈希,内置随机盐值管理:
用户密码 + 随机盐 → PBKDF2(SHA256, 320000轮) → 存储哈希值from django.contrib.auth.hashers import make_password
# 生成密码哈希(自动管理盐值)
hashed = make_password("mypassword")
# 结果格式:pbkdf2_sha256$320000$随机盐$哈希值from django.contrib.auth.hashers import check_password
# 验证密码是否正确
is_correct = check_password("mypassword", hashed)
# 返回 True 或 FalseDjango 密码哈希格式:algorithm$iterations$salt$hash
pbkdf2_sha256$320000$abc123def456$longhashvalue...| 部分 | 说明 |
|---|---|
pbkdf2_sha256 | 哈希算法 |
320000 | 迭代次数(工作因子) |
abc123def456 | 随机盐值 |
longhashvalue... | 哈希结果 |
快速获取当前登录用户的 ID:
from utils.security import get_user_id
def some_view(request):
user_id = get_user_id(request)
if user_id:
# 执行需要用户ID的操作
create_log(user_id, "操作内容")快速获取当前登录用户的真实姓名:
from utils.security import get_username
def add_example(request):
Example.objects.create(
name="示例",
create_user=get_username(request),
update_user=get_username(request),
)生成 JWT 访问令牌:
from utils.jwt import create_token
payload = {'userId': 1001, 'username': 'admin', 'realname': '管理员'}
token = create_token(payload, timeout=20) # 20分钟过期从请求头解析 JWT Token,获取用户信息:
from utils.jwt import parse_token
result = parse_token(request)
if result['code'] == 0:
user_id = result['data']['userId']
username = result['data']['username']
realname = result['data']['realname']刷新 JWT 令牌,延长有效期:
from utils.jwt import refresh_token
result = refresh_token(old_token, extend_minutes=30)
if result['code'] == 0:
new_token = result['data']['access_token']退出登录时将 Token 加入黑名单,使其立即失效:
from utils.jwt import add_token_to_blacklist
# 退出登录时调用
add_token_to_blacklist(token)黑名单使用 Redis 存储,TTL 与 Token 剩余有效期一致,Token 自然过期后黑名单条目自动清除。
from django.contrib.auth.hashers import check_password
from utils.jwt import create_token
def login(request):
data, error = parse_request_body(request)
username = data.get('username')
password = data.get('password')
# 查询用户
user = User.objects.filter(username=username, is_delete=False).first()
if not user:
return R.failed(msg="用户名或密码错误")
# 验证密码
if not check_password(password, user.password):
return R.failed(msg="用户名或密码错误")
# 生成 Token
payload = {
'userId': user.id,
'username': user.username,
'realname': user.realname,
}
token = create_token(payload)
return R.ok(data={'access_token': token})from django.contrib.auth.hashers import make_password, check_password
def reset_password(request):
# 验证旧密码
if not check_password(old_password, user.password):
return R.failed("原密码错误")
# 生成新密码哈希
user.password = make_password(new_password)
user.save()1. 随机盐值:Django 自动为每个密码生成随机盐值,即使两个用户使用相同密码,存储的哈希值也不同
2. 抗彩虹表:每个密码都有独立盐值,无法预计算彩虹表
3. 抗暴力破解:PBKDF2 320000 次迭代,大幅增加暴力破解成本
4. 自适应性:可通过修改迭代次数提升安全性密码工具使用 Django 内置的 make_password/check_password,基于 PBKDF2 + SHA256 算法,自动管理随机盐值。utils/security.py 提供 get_user_id() 和 get_username() 快速获取当前登录用户信息。JWT Token 通过 utils/jwt.py 管理,支持生成、解析、刷新和黑名单功能。