您的位置:

HMAC-SHA256加密算法

一、什么是HMAC-SHA256

HMAC-SHA256(Hash Message Authentication Code-Secure Hash Algorithm 256 bit)是一种加密算法,是SHA-256散列函数与一个密钥结合的身份验证方法。HMAC的安全性基于散列函数(SHA-256),而且可以通过密钥的添加来增加信任度。此算法经常用于网络领域中,例如 HTTPS、SSL、SSH 等加密通讯领域。

二、HMAC-SHA256算法的工作原理

在进行HMAC-SHA256算法运算时,需要传递两个参数key和data,其中key是一个密钥,data是需要进行散列的数据。算法流程如下:

  1. 通过密钥key经过一个特定的方法,将key转换成一个value。

  2. 通过异或运算符(XOR)以填充value。如果key太长,即大于block_size位,需要通过SHA-256散列函数将key压缩到block_size位。

  3. 将填充后的value和data传递给SHA-256哈希函数,得到一个256位的哈希值。

  4. 将哈希值作为结果返回。

这样,我们就得到了一个充分利用密钥安全性的、结果得到哈希码长度为256位的信息鉴别码。由于密钥的妥善保管和其他安全措施的增加以20毫秒为单位的运算时间会远远超过人类寿命的可承受范围。

三、HMAC-SHA256的使用场景

HMAC-SHA256算法在以下场景中得到了广泛的应用:

  1. 网络安全,例如在HTTPS、SSL和SSH这些安全连接中,使用HMAC-SHA256算法对网络传输数据进行加密。

  2. 数字签名,用来对数据进行身份鉴别,保证数据传输的完整性,确保数据未被篡改。

  3. 密码学,HMAC-SHA256算法可作为证明算法,用来证明某个实体拥有特定的密钥。

  4. API安全验证,在API接口请求中,使用HMAC-SHA256算法保证数据在请求和响应传输过程中的完整性和安全性。

四、HMAC-SHA256的代码示例

PHP的HMAC-SHA256加密

function hmac_sha256($key, $data){
  return hash_hmac('sha256', $data, $key, true);
}

$key = 'This_is_a_secret_key';
$data = 'This_is_a_message';
echo bin2hex(hmac_sha256($key, $data));  // 266c5f26f703f459fe1d1f05e7b44e27abd65c257abd16c910712d3f8d25b0b5

Java的HMAC-SHA256加密

public static String hmacSha256(String key, String data) {
  try {
      Mac hmac_SHA256 = Mac.getInstance("HmacSHA256");
      SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
      hmac_SHA256.init(secret_key);
      byte[] hash = hmac_SHA256.doFinal(data.getBytes(StandardCharsets.UTF_8));
      return bytesToHex(hash);
  } catch (NoSuchAlgorithmException | InvalidKeyException e) {
      throw new RuntimeException("Exception while encrypting data with HMAC-SHA256", e);
  }
}

public static String bytesToHex(byte[] bytes){
  StringBuilder builder = new StringBuilder();
  for (byte b : bytes) {
      builder.append(String.format("%02x", b & 0xff));
  }
  return builder.toString();
}

String key = "This_is_a_secret_key";
String data = "This_is_a_message";
System.out.println(hmacSha256(key, data));  // 266c5f26f703f459fe1d1f05e7b44e27abd65c257abd16c910712d3f8d25b0b5

Python的HMAC-SHA256加密

import hmac
import hashlib

def hmac_sha256(key, data):
  hmac_sha256 = hmac.new(key.encode('utf-8'), data.encode('utf-8'), hashlib.sha256).digest()
  return hmac_sha256.hex()

key = 'This_is_a_secret_key'
data = 'This_is_a_message'
print(hmac_sha256(key, data))  # 266c5f26f703f459fe1d1f05e7b44e27abd65c257abd16c910712d3f8d25b0b5