go - 使用此代码,您如何知道是否会使用 sha256 或 sha512?
问题描述
愚蠢的问题,在下面的代码中,考虑到名称是sha512.New512_256,使用的是512还是256?你如何控制你想要的?我知道我在这里遗漏了一些基本的东西..
另外,当我对此进行更多研究时,我想知道 hmac 是否根本不是我想要的……我正在寻找一些小型散列实用程序,这些实用程序将对任何字符串输入或作为参数给出的文件进行散列。我也会指定要用作输入参数的哈希类型......所以我希望每次在同一个文件或字符串上使用的相同哈希算法都有相同的哈希结果......我应该使用其他东西吗?
谢谢
import (
"crypto/hmac"
"crypto/sha512"
)
func Hash(tag string, data []byte) []byte {
h := hmac.New(sha512.New512_256, []byte(tag))
h.Write(data)
return h.Sum(nil)
}
解决方案
SHA512 属于 SHA-2 系列。NIST FIPS 180-4中列出了变体
- SHA-512/256 truncated from SHA-512 with different initial values
- SHA-512/224 truncated from SHA-512 with different initial values
- SHA-384 truncated from SHA-512 with different initial values
- SHA-512
- SHA-224 truncated from SHA-256 with different initial values
- SHA-256
为了将这些散列函数的域(称为域分离)与其截断版本分开,使用不同的初始值。否则,对截断版本的攻击可以携带到其他版本,vv
- 第一个问题
当sha512.New512_256
您实际从中选择一个哈希函数时SHA-512
,在这种情况下,它是SHA-512/256
,您可以通过查看其字符串从 godoc.org列表中选择其他函数。
- 第二个问题
你可能hash
不需要hmac
。HMAC 是一种基于哈希的密钥消息认证代码,它对使用密钥进行认证很有用。每次控制哈希(或校验和)时,您都需要密钥。
但是,该库使用Sum512
orSum512_256
等来计算给定数据的校验和(散列)。计算哈希的示例代码是:
sha_512 := sha512.New()
sha_512.Write([]byte(input))
hash := base64.URLEncoding.EncodeToString(sha_512.Sum(nil))
截断时
起初,截断的想法可能看起来不合理。实际上并非如此。SHA-512 和 SHA-256 有长度扩展攻击。但是,截断版本有阻力,请参阅维基百科上的表格。
还应该注意的是,SHA3 系列旨在抵抗长度扩展攻击。容量可以防止攻击。