Django check_password原理

news/2025/2/24 14:24:35

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

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

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

1. 密码存储的原理

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

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

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

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

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

python">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. 比对哈希值:将重新计算的哈希值与数据库中存储的哈希值进行比对。如果两者一致,说明用户输入的密码是正确的。

例如

python">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.niftyadmin.cn/n/5864458.html

相关文章

游戏引擎学习第119天

仓库:https://gitee.com/mrxiao_com/2d_game_3 上一集回顾和今天的议程 如果你们还记得昨天的进展,我们刚刚完成了优化工作,目标是让某个程序能够尽可能快速地运行。我觉得现在可以说它已经快速运行了。虽然可能还没有达到最快的速度,但我们…

六十天前端强化训练之第一天HTML5语义化标签深度解析与博客搭建实战

欢迎来到编程星辰海的博客讲解 目录 一、语义化标签的核心价值 1.1 什么是语义化? 1.2 核心优势 二、语义标签详解与使用场景 2.1 布局容器标签 2.2 内容组织标签 三、博客结构搭建实战 3.1 完整HTML结构 3.2 核心结构解析 3.3 实现效果说明 四、学习要点…

50周学习go语言:第三周 流程控制与FizzBuzz实现

以下是第三周流程控制与FizzBuzz游戏的详细教程,包含完整语法讲解和分步实现指南: 第三周:流程控制与FizzBuzz实现 一、if/else条件判断 1. 基本语法 if 条件表达式 {// true时执行 } else if 其他条件 {// 其他分支 } else {// 默认分支 }…

【MySQL 一 数据库基础】深入解析 MySQL 的索引(2)

索引 MySQL中的页 为什么要使用页? 在.ibd文件中最重要的结构体就是Page(页),页是内存与磁盘交互的最小单元,默认大小为16KB,每次内存与磁盘的交互至少读取一页,,所以在磁盘中每个页内部的地址都是连续的; …

(五)趣学设计模式 之 建造者模式!

目录 一、 啥是建造者模式?二、 为什么要用建造者模式?三、 建造者模式怎么实现?四、 建造者模式的应用场景五、 建造者模式的优点和缺点六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方…

STM32的HAL库开发---ADC采集内部温度传感器

一、STM32内部温度传感器简介 二、温度计算方法 F1系列: 从数据手册中可以找到V25和Avg_Slope F4、F7、H7系列只是标准值不同,自行查阅手册 三、实验简要 1、功能描述 通过ADC1通道16采集芯片内部温度传感器的电压,将电压值换算成温度后&…

垂类大模型微调(二):使用LLaMA-Factory

上一篇博文和大家一起安装了LLaMA-Factory工具,并下载了大模型在上面进行了简单的加载和推理,今天尝试通过LoRa技术对大模型进行微调; 一、训练集准备 1.1 介绍训练集结构 这里演示对Qwen2.5-0.5B-Instruct-GPTQ-Int4模型进行LoRA微调, 大家可以根据垂类大模型微调(一)…

LeetCode 热题 100 560. 和为 K 的子数组

LeetCode 热题 100 | 560. 和为 K 的子数组 大家好,今天我们来解决一道经典的算法题——和为 K 的子数组。这道题在 LeetCode 上被标记为中等难度,要求我们统计数组中所有和为 k 的连续子数组的个数。下面我将详细讲解解题思路,并附上 Pytho…