必须先安装bcrypt库且校验须用checkpw():Python无内置bcrypt,需pip install bcrypt(Windows加--only-binary,macOS M1/M2先装openssl);salt必须由gensalt()生成;hashpw()输入明文需encode()为bytes;校验必须用checkpw()而非==比对;数据库字段至少VARCHAR(60)。

bcrypt 加密前必须先安装 bcrypt 库
Python 标准库不带 bcrypt,直接 import bcrypt 会报 ModuleNotFoundError: No module named 'bcrypt'。这不是你代码写错了,是环境缺依赖。
- 用 pip 安装:
pip install bcrypt - Windows 用户如果报编译错误,优先试
pip install bcrypt --only-binary=bcrypt - macOS M1/M2 芯片上若遇到
clang: error,先装brew install openssl再重试
hashpw() 的 salt 必须用 gensalt() 生成,不能手写或复用
bcrypt.hashpw() 第二个参数要求是 bytes 类型的 salt,且必须由 bcrypt.gensalt() 产出。用字符串拼接、固定字节串或上一次的 salt,会导致哈希不可验证或安全性归零。
- 正确做法:
hashed = bcrypt.hashpw(password.encode(), bcrypt.gensalt()) - 错误示例:
bcrypt.hashpw(b'123', b'salt123')—— 这不是 bcrypt salt,校验时必失败 -
gensalt()默认使用 12 轮 cost(即rounds=12),可调高但别超过 16,否则登录延迟明显
校验密码必须用 checkpw(),别自己比对 hash 字符串
有人把 hashpw() 输出存进数据库后,想用 == 直接比对明文和 hash 字符串,这完全无效——因为每次 hashpw() 结果都不同(salt 随机)。唯一可靠方式是用 bcrypt.checkpw()。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 正确流程:
bcrypt.checkpw(plain_password.encode(), stored_hash) -
stored_hash必须是完整哈希字符串(形如b'$2b$12$...),不能只存其中一部分 - 输入明文必须是
bytes;如果传 str 会报TypeError: Unicode-objects must be encoded before hashing - 即使 hash 字符串被篡改(比如少几个字符),
checkpw()会静默返回False,不会抛异常
数据库字段长度至少留 60 字节,UTF-8 编码下别用 varchar(32)
bcrypt 输出的 hash 是 ASCII 字符串,标准长度为 60 字符(例如 $2b$12$K8qWzZQvJXfY7nRtPmLsOeU9aBcDfGhIjKlMnOpQrStUvWxYzA1B2C3)。MySQL 或 SQLite 里如果字段设成 varchar(32),会自动截断,导致后续所有 checkpw() 全部失败。
- 安全起见,字段定义用
CHAR(60)或VARCHAR(60) - PostgreSQL 用户注意:不要用
TEXT类型存 hash——虽然能存,但某些 ORM 会默认加额外处理,反而引入意外编码问题 - 如果已有数据被截断,无法恢复原始密码,只能重置
实际用起来最常卡住的地方就两个:一是没装 bcrypt 库就急着跑代码,二是把 hash 当普通字符串去比对。其他细节只要按这四条做,基本不会掉坑里。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










