愚蠢的问题,在下面的代码中,考虑名称为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
要将这些哈希函数的域(称为域分离)从其截断版本中分离出来,将使用不同的初始值。否则,可以将对截断版本的攻击带入其他版本,[v.v。
[使用sha512.New512_256
实际上是从SHA-512
中选择一个散列函数,在这种情况下,它是SHA-512/256
,您可以通过查看它们的字符串从godoc.org的list中选择其他函数。
您可能需要hash
而不是hmac
。 HMAC是keyed hash-based message authentication代码,使用密钥进行身份验证非常有用。对于每次控制哈希(或校验和)的时间,您都需要密钥。
但是,库使用Sum512
或Sum512_256
等来计算给定数据的校验和(哈希)。计算哈希的示例代码为:
sha_512 := sha512.New() sha_512.Write([]byte(input)) hash := base64.URLEncoding.EncodeToString(sha_512.Sum(nil))
截断中
起初,截断的想法似乎是unsound。其实不是。 SHA-512和SHA-256具有length extension attacks。但是,截断的版本具有resistances, see table on wikipedia。
还应注意,SHA3系列旨在抵抗长度扩展攻击。 capacity prevents攻击。