跳到主要内容

Go bcrypt 加密和验证

· 阅读需 2 分钟
素明诚
Full stack development

用户密码操作逻辑

ab8728506ace7f3843be0b7ec061dcee## 解密原理

假设用户加密后的密码是 $2a$10$nOUIs5kJ7naTuTFkBy1veuK0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa

应用程序从数据库读取存储的 bcrypt 哈希字符串,就是上面那一串

bcrypt 库解析这个哈希字符串

  • 提取算法标识符: $2a$
  • 提取成本因子: 10
  • 提取盐值: nOUIs5kJ7naTuTFkBy1veu

bcrypt 解密流程

  • bcrypt 库现在知道它需要使用 $2a$ 算法,成本因子 10,以及盐值 nOUIs5kJ7naTuTFkBy1veu。
  • 应用程序将用户输入的密码,提取的盐值 (nOUIs5kJ7naTuTFkBy1veu) 和成本因子 (10) 传递给 bcrypt。
  • bcrypt 使用提供的盐值和成本因子,根据 $2a$ 算法对用户输入的密码进行哈希计算。
  • bcrypt 返回计算出的哈希值。
  • 程序比较计算出的哈希值和存储的哈希值 (K0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa)。
  • 如果两个哈希值匹配,则密码验证通过。否则,密码验证失败。

流程图如下

2a655cea1bc7fe3d7c3f1996bb0b5c08## Go 加密解密示例代码

package main

import (
"fmt"
"golang.org/x/crypto/bcrypt"
)

func main() {
// 原始密码
password := "MyPassword123"

// 加密密码
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
if err != nil {
fmt.Println("加密错误:", err)
return
}
fmt.Println("加密后的密码:", string(hashedPassword))

// 验证密码
err = bcrypt.CompareHashAndPassword(hashedPassword, []byte(password))
if err != nil {
fmt.Println("密码不匹配")
} else {
fmt.Println("密码匹配")
}
}