bcrypt专用于web应用密码存储,需在后端代码中通过golang.org/x/crypto/bcrypt(go)或bcryptpasswordencoder(java spring)实现,cost推荐12,数据库存完整hash字符串(如$2b$12$...),不适用于系统账户认证。

直接在应用层设置 bcrypt,不是改服务器系统账户的登录密码算法(Linux/Windows 系统账户本身不支持 bcrypt)。bcrypt 是专为 Web 应用中用户密码存储设计的哈希算法,需由你的后端服务代码控制生成与验证逻辑。
明确适用场景
bcrypt 用于你开发的业务系统中:用户注册时密码加密、登录时密码比对、重置密码等环节。它不替代操作系统的 passwd、shadow 或 Active Directory 的认证机制。
常见误操作包括:试图在 Linux 的 /etc/shadow 中写入 b$ 开头的 hash(系统不识别),或在 Nginx/Apache 基础认证里硬塞 bcrypt —— 这些都不生效。
Go 语言中正确配置 bcrypt
使用官方维护的包:"golang.org/x/crypto/bcrypt"
- 生成密码时显式指定 cost,推荐 cost=12(兼顾安全与性能):
hash, err := bcrypt.GenerateFromPassword([]byte("user123"), 12) - 绝不依赖默认 cost=10,尤其在容器或高并发环境,可能引发 CPU 饱和、连接积压甚至
too many open files错误 - 验证必须用
bcrypt.CompareHashAndPassword(hash, []byte(input)),不能用==或strings.EqualFold—— 否则有计时攻击风险 - 数据库中完整保存返回的字符串(如
$2b$12$abc...xyz),含前缀、cost、salt 和密文,不可截断 - 若从 PHP 迁移老数据,遇到
$2y$开头的 hash,需先替换为$2b$再验证(仅改前缀,其余不变)
Java(Spring Security)中启用 bcrypt
在 Spring Boot 项目中,无需手动调用 jBCrypt,直接配置编码器即可:
- 引入依赖:
spring-boot-starter-security(已内置BCryptPasswordEncoder) - 配置类中声明 Bean:
@Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(12); } - 确保注册接口调用
passwordEncoder.encode(rawPassword)存库;登录时框架自动调用比对逻辑 - 老密码 hash 若 cost 不同(如原为 10),可兼容验证;但新注册统一走 cost=12
关键注意事项
bcrypt 的 hash 字符串自带 salt 和 cost,所以:
- 不需要单独建字段存 salt,也不需要自己拼接或管理 salt 生命周期
- 不要在
init()、静态块或全局初始化阶段调用加密函数 —— 会阻塞启动 - 数据库字段建议设为
VARCHAR(60)或更长($2b$12$开头的标准输出长度为 60) - 若读库拿到空值或 null,调用
CompareHashAndPassword会 panic,务必先判空











