Tags: 加密算法, 项目内容
Published: 2024年6月21日
概要: 本页博客概述了 Bcrypt 加密算法,包括其优点以及用于hash和验证密码的 Golang 代码演示。
MD5(Message Digest Algorithm 5)是一种广泛应用的哈希函数,于1991年由罗纳德·李维斯特(Ronald Rivest)设计。它将任意长度的数据输入(通常是字符串)转化为一个128位(16字节)长的哈希值(散列值),也称为消息摘要。这一哈希值通常用32位十六进制数表示。
填充数据: 在数据末尾进行填充,使数据长度满足长度是512的倍数。这是通过在数据末尾添加一个 "1" 位,后跟若干个 "0" 位,直到数据长度正好满足512比特块的要求。最后添加一个64位的整数,表示填充前的原始数据长度。
初始化 MD5 缓冲区: 初始化四个32位的缓冲区,分别为A、B、C、D。其初始值是固定的。
处理每个512位的数据块:
◦ 分配64轮变换,每一轮使用一个非线性函数,对当前数据块和缓冲区的值进行处理。
◦ 在每一轮中,这些缓冲区值将彼此混合,并与当前处理的512位数据块中的32位子块相加。
输出: 经过所有数据块的处理后,缓冲区 A、B、C、D 中的值合并起来,形成最终的128位哈希值。
虽然 MD5 在设计时是作为一种快速、高效的哈希算法,但是在安全性上有一些缺陷:
因为hash算法是固定的,所以同一个字符串计算出来的hash串是固定的,所以,可以采用如下的方式进行破解。
Bcrypt 是专为密码哈希设计的算法,其目的是提供一种更加安全的存储方式来保护用户密码。Bcrypt 是由 Niels Provos 和 David Mazieres 基于 Blowfish 加密算法设计的密码哈希算法,专注于抵抗暴力破解和彩虹表攻击。
$
符号分隔的字符串,包括版本信息、工作因子、盐值和最终的哈希值。获取存储的哈希密码: 从数据库中获取的哈希密码为 stored_hashed_password
。
使用 Bcrypt 的校验函数进行比对:
◦ Bcrypt 自动从存储的哈希密码中提取盐值和工作因子。
◦ Bcrypt 使用提取的盐值和工作因子,对用户输入的密码进行哈希计算。
◦ 将计算出的哈希值与存储的哈希值进行比较。
返回校验结果: 如果计算出的哈希值与存储的哈希值匹配,则表示密码正确;否则,密码不正确。
在 Go 语言中,可以使用 golang.org/x/crypto/bcrypt
包来进行 Bcrypt 密码哈希和验证。
gopackage main
import (
"fmt"
"golang.org/x/crypto/bcrypt"
)
func main() {
// 用户输入的密码
password := "my_password"
// 哈希密码,使用成本因子 14(可以根据需求调整)
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
if err != nil {
fmt.Println("Error hashing password:", err)
return
}
// 输出哈希密码(存储在数据库中)
fmt.Println("Hashed Password:", string(hashedPassword))
}
gopackage main
import (
"fmt"
"golang.org/x/crypto/bcrypt"
)
func main() {
// 用户输入的原始密码
password := "my_password"
// 从数据库中获取的存储的哈希密码
storedHashedPassword := "$2a$10$.7u0Y17IZEUw3pswrIXISeBgk.EKQdxGvU31H3yMRolDyyl/T4wKG" // 示例哈希密码,需要替换为实际存储的值
// 验证密码
err := bcrypt.CompareHashAndPassword([]byte(storedHashedPassword), []byte(password))
if err != nil {
fmt.Println("Password is incorrect.")
} else {
fmt.Println("Password is correct.")
}
}
本文作者:AstralDex
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!