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 关注
- 233 浏览
添加回答
举报
