在Go语言中,使用bcrypt算法进行密码的加密和校验是一种常见的做法,因为bcrypt算法可以提供强大的密码安全性。
bcrypt可以用于数据库中的用户密码保存,相比md5而言更加的安全可靠
文档
文档上给出了标准文档,这个库是下面这个文件描述的算法golang实现:
安装
go get -u golang.org/x/crypto/bcrypt
案例:多次运行后,生成的结果是不一样的
Go
package main
import (
"fmt"
"golang.org/x/crypto/bcrypt"
)
func main() {
password := "123qwe"
hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
fmt.Println(string(hashedPassword))
}
案例二:bcrypt不能解密,不过可以比较加密后的数据和加密前的数据是否相匹配
Go
package main
import (
"fmt"
"golang.org/x/crypto/bcrypt"
)
func main() {
password := "123qwe"
hashedPassword, err := GenerateFromPassword(password)
if err != nil {
fmt.Println("加密失败")
}
if CompareHashAndPassword(hashedPassword, password) {
fmt.Println("密码匹配")
} else {
fmt.Println("密码不匹配")
}
}
// GenerateFromPassword 加密
func GenerateFromPassword(password string) (string, error) {
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
if err != nil {
return "", err
}
return string(hashedPassword), err
}
// CompareHashAndPassword 比较加密后的数据和加密前的数据是否相匹配
func CompareHashAndPassword(hashPassword string, password string) bool {
err := bcrypt.CompareHashAndPassword([]byte(hashPassword), []byte(password))
return err == nil
}
案例三:
Go
package main
import (
"fmt"
"golang.org/x/crypto/bcrypt"
)
func HashPassword(password string) (string, error) {
bytes, err := bcrypt.GenerateFromPassword([]byte(password), 14)
return string(bytes), err
}
func CheckPasswordHash(password, hash string) bool {
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
return err == nil
}
func main() {
password := "123qwe"
hash, _ := HashPassword(password) // 为了简单忽略错误处理
fmt.Println("Password:", password)
fmt.Println("Hash: ", hash)
match := CheckPasswordHash(password, hash)
fmt.Println("Match: ", match)
}
注意事项
- 密码加密和校验是用户认证过程中的重要环节,使用bcrypt可以提高安全性。
- 选择合适的成本因子(cost factor)以平衡安全性和性能。
- 在实际应用中,错误处理是非常重要的,示例代码中为了简单起见忽略了错误处理。
- 密码加密后存储在数据库中,用户登录时需要进行校验。