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 等)都是一樣的。
我很想聽聽有人對為什么這不是巨大的安全漏洞的想法。
TA貢獻1860條經驗 獲得超8個贊
正如您已經注意到的:您必須將 UTF8 字符串轉換為節點應用程序中使用的任何編碼。這可以通過編碼包來完成,例如:
golang.org/x/text/encoding/charmap
isoString, err := charmap.ISO8859_1.NewEncoder().Bytes([]byte(stringToEncode))
考慮到’iso-8859-1 中不允許使用該字符,我們可以假設您有不同的編碼。現在你只需要弄清楚是哪一個!
在更糟糕的情況下,您可能必須使用其他包而不是charmap.
- 2 回答
- 0 關注
- 211 瀏覽
添加回答
舉報
