当前位置: 首页 > article >正文

Django check_password原理

check_password 是 Django 提供的一个用于密码校验的函数,它的工作原理是基于密码哈希算法的特性。

Django 的 make_password 函数在生成密码哈希时,会使用一个随机的 salt(盐值)。这个 salt 会与密码一起进行哈希运算,生成最终的哈希值。由于 salt 是随机的,因此即使输入相同的密码,生成的哈希值也会不同。

 为什么 check_password 可以正确校验密码?

1. 密码存储的原理

在 Django 中,密码通常是以哈希值的形式存储在数据库中的,而不是明文存储。哈希是一种单向加密算法,它可以将任意长度的输入(如密码)转换为固定长度的输出(哈希值)。哈希算法的特点是:

  • 不可逆性:无法从哈希值反推出原始密码。

  • 唯一性:不同的输入几乎不可能生成相同的哈希值。

  • 随机性:即使输入相同,每次生成的哈希值也可能不同(因为使用了随机的 salt)。

Django 使用 make_password 函数对密码进行哈希处理。例如:

from django.contrib.auth.hashers import make_password

# 对密码进行哈希处理
hashed_password = make_password('qwe123')
print(hashed_password)

 结果类似下面的

生成的哈希值包含以下部分:

  • 算法名称(如 pbkdf2_sha256:用于标识使用的哈希算法。

  • 迭代次数(如 600000:用于增加哈希计算的复杂度。

  • Salt(盐值,如 8GwcoEyP0yk48cG89Emm8w):一个随机字符串,用于增加哈希的唯一性。

  • 哈希值(如 XsogYGIVzWCEvUuJwIMuYMNGt5wFyyiEpi+vh1kz39g=):密码和 salt 经过哈希算法计算后的结果。

2. 密码校验的原理

当用户登录时,输入的密码需要与数据库中存储的哈希密码进行比对。由于哈希是不可逆的,我们不能直接解密哈希值来获取原始密码。因此,Django 使用 check_password 函数来完成密码校验。

check_password 的工作原理如下:

  1. 提取 Salt:从数据库中存储的哈希密码中提取出 salt。

  2. 重新计算哈希值:将用户输入的密码与提取的 salt 结合,使用相同的哈希算法和迭代次数重新计算哈希值。

  3. 比对哈希值:将重新计算的哈希值与数据库中存储的哈希值进行比对。如果两者一致,说明用户输入的密码是正确的。

例如

from django.contrib.auth.hashers import check_password

# 用户输入的密码
input_password = 'qwe123'

# 数据库中存储的哈希密码
stored_hashed_password = 'pbkdf2_sha256$600000$uRejMsolXFgxqvVJk5543w$XsogYGIVzWCEvUuJwIMuYMNGt5wFyyiEpi+vh1kz39g='

# 校验密码
is_valid = check_password(input_password, stored_hashed_password)
print(is_valid)  # 如果密码正确,返回 True;否则返回 False

哈希算法的确定性:只要输入(密码 + salt)和算法参数(如迭代次数)相同,哈希算法的输出就是确定的。因此,check_password 可以通过重新计算哈希值来验证密码的正确性。


http://www.kler.cn/a/558825.html

相关文章:

  • 【计算机网络】OSI模型、TCP/IP模型、路由器、集线器、交换机
  • 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter21-错误处理与调试
  • C++经典框架案例(六)
  • vue从入门到精通(十二):列表渲染
  • 【量化科普】Moving Average,移动平均线
  • React Native 0.76正式版发布,带来多项目更新
  • 工程师 - VSCode的AI编码插件介绍: MarsCode
  • 分布式光纤声波振动技术在钻井泄漏检测中的应用
  • Pi币与XBIT:在去中心化交易所的崛起中重塑加密市场
  • 深入HBase——核心组件
  • 【SpringBoot】_统一功能处理:统一数据返回格式
  • Leetcode-42. Trapping Rain Water [C++][Java]
  • aardio - 计算器
  • C#前端开发面试题
  • VSCode 中设置 Git 忽略仅因时间戳修改导致的文件变更【使用deepseek生成的一篇文章】
  • python-leetcode-搜索二维矩阵 II
  • 8.日常英语笔记
  • 【Python量化金融实战】-第1章:Python量化金融概述:1.2 Python在量化金融中的优势与生态
  • 常用标准库之-std::reduce与std::execution::par
  • 关于雷龙CS SD NAND(贴片式TF卡)的测评体验