不能直接存明文密码,因一旦数据库泄露,攻击者可直接登录所有关联账户,违反最小权限原则和《个人信息安全规范》;必须用werkzeug.security的generate_password_hash哈希存储,并显式指定pbkdf2:sha256:600000与salt_length=32,数据库字段需设为String(128)以完整保存哈希串。

为什么不能直接存明文密码
用户密码一旦泄露,攻击者能直接登录所有关联账户。明文存储违反最小权限原则,也违背《个人信息安全规范》基本要求。Flask 本身不提供密码加密功能,必须依赖外部工具——Werkzeug 的 generate_password_hash 和 check_password_hash 是最轻量、最兼容的选择,无需额外安装(Flask 默认已带)。
用 generate_password_hash 生成哈希值时要注意什么
默认算法是 pbkdf2:sha256,但实际应显式指定更强的变体。常见错误是忽略 salt_length 或沿用默认 16 字节(不够防彩虹表),或误设 iterations 过低(如 10 万次在现代 CPU 上仅需毫秒级,易被暴力破解)。
- 生产环境建议用
pbkdf2:sha256:600000(60 万次迭代),兼顾安全性与响应延迟 - 显式传入
salt_length=32,避免依赖 Werkzeug 内部默认值 - 哈希结果是字符串,可直接存入数据库
String(128)字段(pbkdf2输出长度固定为 112 字符左右)
示例:
from werkzeug.security import generate_password_hash <p>hashed = generate_password_hash( password="user_pass_123", method="pbkdf2:sha256:600000", salt_length=32 )</p><h1>输出类似:pbkdf2:sha256:600000$...$...</h1>
校验时为什么 check_password_hash 必须原样传入数据库存的完整哈希串
该函数会自动解析哈希串里的算法名、迭代次数、salt 和 hash 值,再用相同参数重算比对。如果只截取后半部分(比如去掉前缀),check_password_hash 会静默返回 False,且不报错——这是最常踩的坑。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 数据库字段必须完整保存
generate_password_hash的返回值(含pbkdf2:sha256:600000$...前缀) - 校验代码中不要做任何字符串切片、strip 或正则提取
- 即使哈希串看起来“太长”,也不要手动压缩——Werkzeug 依赖完整结构解析参数
正确用法:
pass
- 模型中密码字段定义为
db.Column(db.String(128), nullable=False) - 注册路由中先哈希再赋值:
user.password_hash = generate_password_hash(form.password.data) - 避免在模型里写
@password.setter自动哈希——会导致序列化、测试、批量导入等场景行为不一致
容易被忽略的一点:哈希过程是 CPU 密集型操作,若在 Web 请求中同步执行大量哈希(比如批量导入用户),可能阻塞主线程。高并发场景下应考虑异步队列或预生成。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










