密码安全加密:使用 Werkzeug 进行加盐哈希存储
📂 所属阶段:第三阶段 — 用户系统(安全篇)
🔗 相关章节:Flask-Login 实战 · 数据验证
1. 绝对禁止的做法
安全无小事,密码存储更是 Web 应用的「第一道生死线」——以下三种错误一旦发生,轻则泄露用户数据、重则面临合规处罚:
安全核心原则:慢哈希算法 + 每个用户独立随机盐 + 专业安全库(比如 Werkzeug)
2. Werkzeug 哈希工具(开箱即用)
Werkzeug 是 Flask 的底层依赖库,自带一套经过 OWASP 验证的密码安全工具,完全不需要我们自己造轮子:
2.1 两个核心函数就够了
Werkzeug 把复杂的加盐、迭代、验证逻辑全封装在两个函数里:
2.2 直接对接数据库的用法
下面是最贴合 Flask/SQLAlchemy 项目的场景代码:
2.3 可选的更强哈希算法
如果对安全要求极高(比如金融、医疗类应用),可以替换 Werkzeug 的默认算法:
3. 更优雅的封装:完整的 User 模型
把密码的哈希和验证逻辑封装到 User 模型内部,可以避免业务层写错,代码更整洁:
封装后,业务层的代码会更简洁:
4. 安全最佳实践清单
只靠 Werkzeug 不够,还需要配合以下安全细节:
✅ 必须做到的
- 始终使用专业安全库(Werkzeug、bcrypt、passlib 等)
- 完全禁止明文/可逆加密存储密码
- 密码、密码哈希永远不要出现在日志、错误信息中
- 登录验证失败时,统一返回「邮箱或密码错误」(防止攻击者枚举用户)
- 生产环境必须全程 HTTPS 传输(防止中间人窃取密码)
- 数据库字段长度至少留 256 字节(防止三段式哈希被截断)
❌ 绝对避免的
- 自己实现哈希算法、盐值生成逻辑
- 用 MD5、SHA1、SHA256 做密码哈希(这些都是「快哈希」,专门用来加速破解的)
- 使用固定盐值、或者从用户名/邮箱中提取盐值
- 在代码中硬编码盐值或加密密钥
- 密码长度限制过短(至少 8 位,建议配合字符复杂度要求)
5. 一分钟总结
安全密码存储的核心,其实就是这「两步走」:
💡 最后提醒:密码哈希只是第一道防线,还要配合「HTTPS传输」「验证码防暴力破解」「密码强度验证」「密码过期提醒」等措施,才能构建完整的用户系统安全体系。
🔗 扩展阅读

