一、什么是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是需要进行散列的数据。算法流程如下:
通过密钥key经过一个特定的方法,将key转换成一个value。 通过异或运算符(XOR)以填充value。如果key太长,即大于block_size位,需要通过SHA-256散列函数将key压缩到block_size位。 将填充后的value和data传递给SHA-256哈希函数,得到一个256位的哈希值。 将哈希值作为结果返回。这样,我们就得到了一个充分利用密钥安全性的、结果得到哈希码长度为256位的信息鉴别码。由于密钥的妥善保管和其他安全措施的增加以20毫秒为单位的运算时间会远远超过人类寿命的可承受范围。
三、HMAC-SHA256的使用场景
HMAC-SHA256算法在以下场景中得到了广泛的应用:
网络安全,例如在HTTPS、SSL和SSH这些安全连接中,使用HMAC-SHA256算法对网络传输数据进行加密。 数字签名,用来对数据进行身份鉴别,保证数据传输的完整性,确保数据未被篡改。 密码学,HMAC-SHA256算法可作为证明算法,用来证明某个实体拥有特定的密钥。 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