Python Web 项目中密码该如何存储?
技术百科
冷炫風刃
发布时间:2026-01-20
浏览: 次 密码必须使用加盐哈希存储,优先选用bcrypt或scrypt等慢哈希算法,配合passlib或bcrypt库实现;数据库字段建议VARCHAR(255)或TEXT;校验须用恒定时间比较函数。
密码绝不能以明文形式存储,必须使用加盐哈希(salted hashing)处理。Python 生态中推荐使用 passlib 或内置的 secrets + hashlib 配合 bcrypt / scrypt 等现代算法,避免用 md5、sha1 或未加盐的哈希。
优先选用 bcrypt 或 scrypt 算法
这些是专为密码设计的慢哈希函数,能有效抵抗暴力破解和彩虹表攻击。它们自动处理加盐、迭代轮数等细节,开发者无需手动管理盐值。
- 安装
bcrypt:pip install bcrypt,然后用bcrypt.hashpw()生成哈希,bcrypt.checkpw()校验 - 更安全的替代是
passlib(支持多种后端),一行代码即可:from passlib.hash import bcrypt; hash = bcrypt.hash("password123") - 避免自己拼接盐和哈希,也不要重复实现加盐逻辑——出错概率高且易被绕过
数据库字段设计要兼容哈希长度
bcrypt 输出约 60 字符(如 b$...),scrypt 或 argon2 可能更长。字段类型建议用 VARCHAR(255) 或更大,别用 CHAR(60) 或短于 100 的长度,否则未来升级算法可能失败。
- PostgreSQL 可用
TEXT类型,MySQL 推荐VARCHAR(255) - 不要截断哈希字符串,哪怕看起来“长得一样”——截断后无法验证
- 若迁移旧系统,需保留原哈希格式标识(如前缀),便于后续识别算法并平滑升级
校验时始终用恒定时间比较
直接用 == 比较字符串可能引发时序攻击。虽然实际风险较低,但专业实现应避免。
-
bcrypt.checkpw()和passlib.verify()内部已使用恒定时间比较,直接调用即可 - 若自行实现(不推荐),请用
hmac.compare_digest(),而不是== - 注意:Web 框架如 Flask-Login、Django 的认证模块已内置安全校验,优先复用
额外防护建议
存储只是基础,还需配合其他措施提升整体安全性。
- 登录接口加速率限制(如 5 次失败后锁定 15 分钟),防暴力爆破
- 敏感操作(如改密、删账号)前要求二次验证(如当前密码或 MFA)
- 定期审计日志,记录登录失败、密码修改等关键事件
-
开发环境禁用密码重置邮件中的明文链接,生产环境强制 HTTPS + Token 限时
+单次有效
# 后端
# python
# 较低
# 推荐使用
# 还需
# 更长
# 专为
# 长得
# 更大
# mac
# https
# word
# go
# 字符串
# 接口
# 数据库
# 事件
# 算法
# Token
# char
# ssl
# mysql
# postgresql
# 开发环境
# 密码重置
# django
# flask
# 请用
# pip
# 绝不能
# 加盐
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11关机快捷键是什么_Win11快速关机方法
- 如何使用Golang管理模块版本_Golanggo
- Windows11如何设置专注助手_Windows
- c++怎么实现高并发下的无锁队列_c++ std:
- mac怎么安装adb_MAC配置Android A
- windows如何禁用驱动程序强制签名_windo
- Win11怎么自动隐藏任务栏_Win11全屏显示设
- mac怎么打开终端_MAC终端Terminal使用
- Linux如何安装JDK11_Linux环境变量配
- 如何在Golang中使用闭包_封装变量与函数作用域
- c++ nullptr与NULL区别_c++11空
- XSLT怎么生成动态的HTML属性名和标签名
- Django 测试数据库表缺失与字段未创建问题的完
- 如何在Golang中处理模块冲突_解决依赖版本不兼
- c# 在高并发场景下,委托和接口调用的性能对比
- c++23 std::expected怎么用 c+
- Win11怎么开启窗口对齐助手_Windows11
- 如何在JavaScript中动态拼接PHP的bas
- Win11怎么开启上帝模式_创建Windows 1
- Win11怎么关闭SmartScreen_禁用Wi
- Win10怎样卸载TeamViewer_Win10
- c++中explicit(bool)的用法 c++
- Windows10如何更改系统字体大小_Win10
- php怎么连接数据库_MySQL数据库连接的基础代
- c++怎么用jemalloc c++替换默认内存分
- Win11怎么清理C盘虚拟内存_Win11清理虚拟
- GML (Geography Markup Lan
- Dapper的Execute方法的返回值是什么意思
- mac怎么安装字体_MAC添加第三方字体与字体册管
- 如何在Golang中实现邮件发送功能_Golang
- c++怎么使用std::unique实现去重_c+
- windows如何测试网速_windows系统网络
- php怎么下载安装并配置环境变量_命令行调用PHP
- Windows10系统怎么查看防火墙状态_Win1
- Win10怎么创建桌面快捷方式 Win10为应用创
- Win10电脑怎么设置网络名称_Windows10
- Linux如何安装Golang环境_Linux下G
- Go 中 defer 在 goroutine 内部
- PythonPandas数据分析项目教程_时间序列
- Python与GPU加速技术_CUDA与Numba
- Windows 11怎么更改锁屏超时时间_Wind
- 如何使用Golang理解结构体指针方法接收者_Go
- Win11色盲模式怎么开_Win11屏幕颜色滤镜设
- Windows 10自带杀毒软件在哪_Window
- Python配置文件操作教程_JSONINIYAM
- Win11怎么关闭自动更新 Win11永久关闭系统
- 微信里的php文件怎么变mp4_微信接收php转m
- VSC怎样在Linux运行PHP_Ubuntu系统
- Win11怎么关闭系统透明度_Windows11个
- windows 10应用商店区域怎么改_windo


QQ客服