亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

以節點兼容的方式編碼 md5

以節點兼容的方式編碼 md5

Go
慕無忌1623718 2021-12-13 11:03:36
我正在轉換節點服務。為此,我需要一個兼容的 md5 哈希(不是用于存儲密碼!?。┥善?。然而,在這個例子中,我不斷得到不同的結果:節點crypto在創建md5s時采用編碼參數。> crypto.createHash("md5").update("1Editor’s notebook: Escaping temptation for turf145468066").digest("hex")'c7c3210bd977b049f42c487b8c6d0463'在 golang 中:(test_encode.go)package mainimport (    "crypto/md5"    "encoding/hex"    "testing")func TestFoo(t *testing.T) {    const result = "c7c3210bd977b049f42c487b8c6d0463"    stringToEncode := "1Editor’s notebook: Escaping temptation for turf145468066"    hash := md5.Sum([]byte(stringToEncode))    hashStr := hex.EncodeToString(hash[:])    if hashStr != result {        t.Error("Got", hashStr, "expected", result)    }}然后go test test_encode.go結果是:--- FAIL: TestFoo (0.00s)encode_test.go:17: Got c3804ddcc59fabc09f0ce2418b3a8335 expected c7c3210bd977b049f42c487b8c6d0463FAILFAIL    command-line-arguments  0.006s我已經將其追蹤到節點代碼中的encoding參數crypto.update。而事實上,字符串作為’引號字符在里面。如果我指定"utf8"它有效。crypto.createHash("md5").update("1Editor’s notebook: Escaping temptation for turf145468066", "utf8").digest("hex")但是:我無法更改節點代碼,因此 go 代碼必須兼容。關于該怎么做的任何想法?
查看完整描述

2 回答

?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

在對 node 和 V8 進行大量挖掘之后,我得出了以下結論:


require("crypto").createHash("md5").update(inputString).digest("hex");

非常危險,因為未指定將輸入字符串編碼為“ASCII”。經過大量挖掘后,其中是等效的(在我最后的大型輸入集上進行了驗證):


// toNodeASCIIString converts a string to a byte of node compatible ASCII string

func toNodeASCIIString(inputString string) []byte {

    lengthOfString := utf8.RuneCountInString(string(inputString))

    stringAsRunes := []rune(inputString)


    bytes := make([]byte, lengthOfString)

    for i, r := range stringAsRunes {

        bytes[i] = byte(r % 256)

    }


    return bytes

}

基本上做的是 256 的 mods 并忘記輸入字符串的很大一部分。


上面的節點示例幾乎是在 node.js 中創建 MD5 哈希的標準和復制粘貼方式。我還沒有檢查過,但我假設這對所有其他哈希(SHA1、SHA256 等)都是一樣的。


我很想聽聽有人對為什么這不是巨大的安全漏洞的想法。


查看完整回答
反對 回復 2021-12-13
?
桃花長相依

TA貢獻1860條經驗 獲得超8個贊

正如您已經注意到的:您必須將 UTF8 字符串轉換為節點應用程序中使用的任何編碼。這可以通過編碼包來完成,例如:

golang.org/x/text/encoding/charmap

isoString, err := charmap.ISO8859_1.NewEncoder().Bytes([]byte(stringToEncode))

考慮到iso-8859-1 中不允許使用該字符,我們可以假設您有不同的編碼。現在你只需要弄清楚是哪一個!

在更糟糕的情況下,您可能必須使用其他包而不是charmap.


查看完整回答
反對 回復 2021-12-13
  • 2 回答
  • 0 關注
  • 211 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號