MD5加密

ice_moss發表於2022-06-28

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 協議》,轉載必須註明作者和本文連結

相關文章