跳到主要内容

Password

password 包提供可插拔的密码编码,通过组合编码器同时支持多种算法。

编码器接口

type Encoder interface {
Encode(password string) (string, error)
Matches(password, encodedPassword string) bool
UpgradeEncoding(encodedPassword string) bool
}

组合编码器

组合编码器将算法标识作为前缀存储在编码后的密码中,实现无缝的算法迁移:

encoder := password.NewCompositeEncoder(
password.Bcrypt, // 新密码默认使用
map[password.EncoderID]password.Encoder{
password.Bcrypt: password.NewBcryptEncoder(),
password.Argon2: password.NewArgon2Encoder(),
password.Scrypt: password.NewScryptEncoder(),
password.SHA256: password.NewSHA256Encoder(),
},
)

编码

encoded, err := encoder.Encode("my-password")
// → "{bcrypt}$2a$10$..."

匹配

编码器自动从 {前缀} 检测算法:

ok := encoder.Matches("my-password", "{bcrypt}$2a$10$...")   // true
ok := encoder.Matches("my-password", "{argon2}$argon2id$...") // true

升级检测

检查密码是否需要重新编码(例如从 SHA256 迁移到 bcrypt):

needsUpgrade := encoder.UpgradeEncoding("{sha256}abc123...")
// → true(因为默认是 bcrypt,不是 sha256)

可用编码器

编码器 ID构造函数安全级别
password.BcryptNewBcryptEncoder()⭐⭐⭐⭐ 推荐
password.Argon2NewArgon2Encoder()⭐⭐⭐⭐⭐ 最强
password.ScryptNewScryptEncoder()⭐⭐⭐⭐ 强
password.SHA256NewSHA256Encoder()⭐⭐ 仅用于遗留系统
password.PlaintextNewPlaintextEncoder()⭐ 仅用于测试

密码格式

编码后的密码格式:{算法}编码值

{bcrypt}$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
{argon2}$argon2id$v=19$m=65536,t=3,p=4$c29tZXNhbHQ$...
{sha256}5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8