sha256 和hamc-sha256区别

发布时间 2023-04-17 12:57:11作者: vx_guanchaoguo0

签名哈希函数

  • SHA-256:SHA-256 是全称为 Secure Hash Algorithm 256(安全散列算法 256)的缩写。SHA-256 可以将任意长度的数据计算成一个长度为 256 位的哈希值,在数字签名中得到广泛应用。
  • SHA-512:SHA-512 是 SHA-256 的加强版,可以生成更长、更不易被碰撞的消息摘要。在一些对于安全性要求较高的场合,比如金融交易等领域中,SHA-512 更为常用。
  • MD5:MD5 是一种不可逆的哈希函数,可以将任意长度的数据计算成一个长度为 128 位的哈希值。然而,由于 MD5 易受到碰撞攻击,已经不再被推荐使用。
  • SHA-3:SHA-3 是美国国家标准技术研究所(NIST)发布的一种哈希算法标准,在2015年成为了美国联邦政府建议使用的哈希函数。SHA-3 具有抗碰撞性、安全性、可扩展性等特点,目前被广泛用于加密通信和数字签名等领域中。

基于哈希函数和密钥的消息认证码算法

  • HMAC-SHA1 使用 SHA-1 哈希函数,生成的 HMAC 值长度为 160 比特。虽然 SHA-1 目前已经被认为不再安全,但 HMAC-SHA1 在某些场景下仍有一定应用。
  • HMAC-SHA256 使用 SHA-256 哈希函数,生成的 HMAC 值长度为 256 比特。SHA-256 是比 SHA-1 更安全的哈希函数,因此 HMAC-SHA256 在更多场合下使用,例如 TLS 协议中的数字签名和认证。
  • HMAC-MD5 使用 MD5 哈希函数,生成的 HMAC 值长度为 128 比特。MD5 目前已经被认为不再安全,因此 HMAC-MD5 也不再安全可靠,建议使用更为安全的哈希函数。

区别

  • 哈希函数 通过hash算法生成固定长度的输出
import hashlib

md5 = hashlib.md5()
md5.update(b'Hello, world!')
print(md5.hexdigest())


  • hamc
    • 选择一个适合的哈希函数 H(如 SHA-256、SHA-512 等);
    • 如果密钥长度超过哈希函数输入块长度,则对密钥进行哈希计算并缩小长度,否则直接使用密钥;
    • 对消息 M 进行哈希计算,并得到哈希结果 H(M);
    • 将密钥作为 HMAC 的输入,再将 H(M) 与密钥进行异或运算,得到最终的输出 HMAC。
import hmac
import hashlib

key = b'secret'
data = b'Hello, world!'

h = hmac.new(key, digestmod=hashlib.md5)
h.update(data)

print(h.hexdigest())
java hutools md5 hmac-md5
import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.core.util.HexUtil;

String str = "Hello, world!";
String md5 = DigestUtil.md5Hex(str);
System.out.println(md5);

 byte[] data = "Hello, world!".getBytes();
byte[] key = "secret".getBytes();
 byte[] hmacMd5 = DigestUtil.hmacMd5(data, key);
String result = HexUtil.encodeHexStr(hmacMd5);
System.out.println(result);