日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

golang中的消息认证

發(fā)布時(shí)間:2025/6/15 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 golang中的消息认证 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

消息認(rèn)證碼

go消息認(rèn)證碼的使用

有一個(gè)包: crypto/hmac

> func New(h func() hash.Hash, key []byte) hash.Hash > - 返回值: hash接口 > - 參數(shù)1: 函數(shù)函數(shù)的函數(shù)名 > sha1.new > md5.new > sha256.new > - 參數(shù)2: 秘鑰 > > 第二步: 添加數(shù)據(jù) > type Hash interface { > // 通過(guò)嵌入的匿名io.Writer接口的Write方法向hash中添加更多數(shù)據(jù),永遠(yuǎn)不返回錯(cuò)誤 > io.Writer > // 返回添加b到當(dāng)前的hash值后的新切片,不會(huì)改變底層的hash狀態(tài) > Sum(b []byte) []byte > // 重設(shè)hash為無(wú)數(shù)據(jù)輸入的狀態(tài) > Reset() > // 返回Sum會(huì)返回的切片的長(zhǎng)度 > Size() int > // 返回hash底層的塊大小;Write方法可以接受任何大小的數(shù)據(jù), > // 但提供的數(shù)據(jù)是塊大小的倍數(shù)時(shí)效率更高 > BlockSize() int > } > type Writer interface { > Write(p []byte) (n int, err error) > } > 第三步: 計(jì)算散列值

使用步驟

  • 前提條件:
    • 在消息認(rèn)證碼生成的一方和校驗(yàn)的一方, 必須有一個(gè)秘鑰
    • 雙方約定好使用同樣的哈希函數(shù)對(duì)數(shù)據(jù)進(jìn)行運(yùn)算
  • 流程:
    • 發(fā)送者:
      • 發(fā)送原始法消息
      • 將原始消息生成消息認(rèn)證碼
        • ((原始消息) + 秘鑰) * 函數(shù)函數(shù) = 散列值(消息認(rèn)證碼)
      • 將消息認(rèn)證碼發(fā)送給對(duì)方
    • 接收者:
      • 接收原始數(shù)據(jù)
      • 接收消息認(rèn)證碼
      • 校驗(yàn):
        • ( 接收的消息 + 秘鑰 ) * 哈希函數(shù) = 新的散列值
        • 通過(guò)新的散列值和接收的散列值進(jìn)行比較
  • // 生成消息認(rèn)證碼 func GenerateHamc(plainText, key []byte)[]byte {// 1.創(chuàng)建哈希接口, 需要指定使用的哈希算法, 和秘鑰myhash := hmac.New(sha1.New, key)// 2. 給哈希對(duì)象添加數(shù)據(jù)myhash.Write(plainText)// 3. 計(jì)算散列值hashText := myhash.Sum(nil)return hashText }// 驗(yàn)證消息認(rèn)證碼 func VerifyHamc(plainText, key, hashText []byte) bool {// 1.創(chuàng)建哈希接口, 需要指定使用的哈希算法, 和秘鑰myhash := hmac.New(sha1.New, key)// 2. 給哈希對(duì)象添加數(shù)據(jù)myhash.Write(plainText)// 3. 計(jì)算散列值hamc1 := myhash.Sum(nil)// 4. 兩個(gè)散列值比較return hmac.Equal(hashText, hamc1) }func main () {src := []byte("在消息認(rèn)證碼中,需要發(fā)送者和接收者之間共享密鑰,而這個(gè)密鑰不能被主動(dòng)攻擊者M(jìn)allory獲取。" +"如果這個(gè)密鑰落入Mallory手中,則Mallory也可以計(jì)算出MAC值,從而就能夠自由地進(jìn)行篡改和偽裝攻擊," +"這樣一來(lái)消息認(rèn)證碼就無(wú)法發(fā)揮作用了。")key := []byte("helloworld")hamc1 := GenerateHamc(src, key)bl := VerifyHamc(src, key, hamc1)//fmt.Printf("校驗(yàn)結(jié)果: %t\n", bl)fmt.Println(bl) }

    消息認(rèn)證碼的問(wèn)題

  • 弊端
    • 有秘鑰分發(fā)困難的問(wèn)題
  • 無(wú)法解決的問(wèn)題
    • 不能進(jìn)行第三方證明
    • 不能防止否認(rèn)
  • 總結(jié)

    以上是生活随笔為你收集整理的golang中的消息认证的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。