Golang使用bcrypt實現(xiàn)密碼加密和校驗的操作代碼
bcrypt可以用于數(shù)據(jù)庫中的用戶密碼保存,相比md5而言更加的安全可靠
文檔
https://pkg.go.dev/golang.org/x/crypto/bcrypt
文檔上給出了標準文檔,這個庫是下面這個文件描述的算法golang實現(xiàn):
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 }
可以看到,多次運行后,生成的結(jié)果是不一樣的
bcrypt不能解密,不過可以比較加密后的數(shù)據(jù)和加密前的數(shù)據(jù)是否相匹配
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> }
由于算法的入?yún)⒑统鰠⒍际亲止?jié)類型的數(shù)據(jù),為了便于使用,可以將兩個方法簡單封裝成一個工具類,將入?yún)⒑统鰠⒍几臑槭亲址愋偷臄?shù)據(jù)
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 }
到此這篇關(guān)于Golang使用bcrypt實現(xiàn)密碼加密和校驗的文章就介紹到這了,更多相關(guān)Golang密碼加密和校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang 實現(xiàn)struct、json、map互相轉(zhuǎn)化
這篇文章主要介紹了golang 實現(xiàn)struct、json、map互相轉(zhuǎn)化,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12淺析go語言如何實現(xiàn)協(xié)程的搶占式調(diào)度的
go語言通過GMP模型實現(xiàn)協(xié)程并發(fā),為了避免單協(xié)程持續(xù)持有線程導致線程隊列中的其他協(xié)程饑餓問題,設(shè)計者提出了一個搶占式調(diào)度機制,本文會基于一個簡單的代碼示例對搶占式調(diào)度過程進行深入講解剖析2024-04-04