Golang:使用 bcrypt 實現密碼加密和和校驗
bcrypt 可以用於數據庫中的用戶密碼保存,相比 md5 而言更加的安全可靠
文檔
- https://pkg.go.dev/golang.org/x/crypto/bcrypt
文檔上給出了標準文檔,這個庫是下面這個文件描述的算法 golang 實現:
- https://www.usenix.org/legacy/event/usenix99/provos/provos.pdf
安裝
go get -u golang.org/x/crypto/bcrypt
加密示例
package main
import (
"fmt"
"golang.org/x/crypto/bcrypt"
)
func main() {
password := "123456"
hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
fmt.Println(string(hashedPassword))
// $2a$10$EvdBpymvP7uDfI0TFRD6RO3YXLwQWUVYKMDqbWFloYCtyNXHCmbD2
// $2a$10$6JDH6z7dJljoDo4VolpHbeIgzqHwhUvF1JRJ/h7Ibf/PjGtx.wZGG
}
可以看到,多次運行後,生成的結果是不一樣的
bcrypt 不能解密,不過可以比較加密後的數據和加密前的數據是否相匹配
package main
import (
"fmt"
"golang.org/x/crypto/bcrypt"
)
func main() {
password := "123456"
hashedPassword := "$2a$10$EvdBpymvP7uDfI0TFRD6RO3YXLwQWUVYKMDqbWFloYCtyNXHCmbD2"
err := bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(password))
fmt.Println(err)
// <nil>
}
由於算法的入參和出參都是字節類型的數據,爲了便於使用,可以將兩個方法簡單封裝成一個工具類,將入參和出參都改爲是字符串類型的數據
package utils
import (
"golang.org/x/crypto/bcrypt"
)
func GenerateFromPassword(password string) (string, error) {
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
if err != nil {
return "", err
}
return string(hashedPassword), err
}
func CompareHashAndPassword(hashPassword string, password string) bool {
err := bcrypt.CompareHashAndPassword([]byte(hashPassword), []byte(password))
return err == nil
}
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/4pO7yMSiwXhTTU7IM1TusQ