MD5 是什麼
全稱為 訊息摘要演算法版本5 (Message Digest Algorithm 5)
它是一種 Hash 演算法。
作用是為了資訊保安。
md5特性:
不可逆性 — 根據 MD5 值計算不出原始資料
唯一性 — 不同原始資料會有不同的 MD5 值 (不完全可靠,後面說)
MD5 到底算不算加密演算法?仁者見仁智者見智吧。說它是加密,因為它確實把原始資料,比如使用者密碼,變成了一般人看不懂的 MD5 值;說它不是加密,因為它不能解密。
據說 Linux 系統中,使用者密碼,都是以 MD5 形式存在檔案中的,這樣你在輸入密碼的時候,計算機只要計算你輸入密碼的 MD5 再跟計算機檔案中儲存的 MD5 進行比對就行了
基於md5鹽值加密
package main
import (
"crypto/md5"
"encoding/hex"
"fmt"
"io"
)
func Md5(code string) string {
//例項化一個md5的物件,將code寫入其中
MD5 := md5.New()
_, _ = io.WriteString(MD5, code)
return hex.EncodeToString(MD5.Sum(nil))
}
func main(){
fmt.Println(Md5("123456"))
}
輸出:e10adc3949ba59abbe56e057f20f883e
實踐運用
在很多時候我們需要對密碼進行加密,這很重要,那麼我們可以使用md5鹽值加密,將密碼+鹽值hash成一個16進位制的字串
鹽值:指的是由隨機陣列成的字串
這個hash的過程可以使用自己來實現,當然也可是找別人已經寫好的
這裡我們在github上找別人已經寫好的
地址:github.com/anaskhan96/go-password-...
安裝
go get github.com/anaskhan96/go-password-encoder
執行
package main
import (
"crypto/md5"
"crypto/sha512"
"encoding/hex"
"fmt"
"io"
"strings"
"github.com/anaskhan96/go-password-encoder"
)
func main() {
// Using custom options
//根據需求選擇鹽值長度,替換次數,key長度,加密方法
options := &password.Options{16, 100, 32, sha512.New}
//輸入密碼,options 返回鹽值和加密後的16進位制密碼
salt, encodedPwd := password.Encode("generic password", options)
//這裡我們根據自身需求將密文密碼儲存格式調整為:加密方法$鹽值$16進位制加密密碼
//最後我們將Newpassword儲存到資料庫
Newpassword := fmt.Sprintf("$pbkdf2-sha512$%s$%s", salt, encodedPwd)
//分割
//當使用者需要核對密碼時,我們呼叫Newpassword,獲取其中的鹽值和16進位制加密密碼
//然後我們將使用者密碼和獲取到的鹽值進行hash,然後16進位制加密密碼核對
Passwordinfo := strings.Split(Newpassword, "$")
fmt.Println(Passwordinfo)
//將分割結果進行驗證,將使用者密碼加鹽,然後和encodedPwd對比
check := password.Verify("generic password", Passwordinfo[2], encodedPwd, options)
fmt.Println(check) // true
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結