实现HMAC-SHA256并编码为Base64
简介
-
HMAC是什么?
HMAC(Hash-based Message Authentication Code,基于哈希的消息认证码)是一种使用密码散列函数,同时结合一个加密密钥,通过特定计算方式生成的消息认证码(MAC)。它可以用来保证数据的完整性,同时可以用作某个消息的身份验证。HMAC算法要求通信双方共享密钥、约定算法,并对报文进行哈希运算,形成固定长度的认证码,从而通过认证码的校验来确定报文的合法性。 -
SHA-256是什么?
SHA-256(Secure Hash Algorithm 256,安全散列算法256)是散列函数(或哈希函数)的一种,能对一个任意长度(按bit计算)的数字消息(message),计算出一个32个字节长度的字符串(又称消息摘要,message digest)。SHA-256由美国国家安全局研发,是SHA-2下细分出的一种算法,对于任意长度的消息,SHA-256都会产生一个256-bit(32-byte数组)的哈希值,称作消息摘要。这个摘要通常用一个长度为64位的十六进制字符串来表示,用于验证数据的完整性。
Java实现HMAC-SHA256
实现思路
在Java中,实现HMAC-SHA256并编码为Base64,通常涉及到使用javax.crypto包中的类。
步骤
-
导入必要的类:你需要导入javax.crypto.Mac,javax.crypto.spec.SecretKeySpec,以及java.util.Base64。
-
初始化Mac实例:使用Mac.getInstance(“HmacSHA256”)来获取HMAC-SHA256的Mac实例。
-
初始化密钥:创建一个密钥(Key)实例,通常是一个字节数组。
-
初始化Mac对象:使用密钥初始化Mac对象。
-
执行MAC计算:对要签名的数据进行更新(update),然后调用doFinal()方法完成计算。
-
编码为Base64:将计算结果编码为Base64字符串。
代码
import android.util.Log;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class EncryptUtils {
public static String HmacSHA256(String message, String secret) throws Exception {
// 获取HMAC-SHA256的Mac实例
Mac mac = Mac.getInstance("HmacSHA256");
// 初始化密钥,这里使用一个示例密钥(在实际应用中,密钥应该保密)
byte[] secretKeyBytes = secret.getBytes(); // 确保密钥长度为256位(32字节)
SecretKeySpec secretKey = new SecretKeySpec(secretKeyBytes, "HmacSHA256");
//初始化Mac对象
mac.init(secretKey);
// 要签名的数据
byte[] dataBytes = message.getBytes();
// 执行MAC计算
byte[] resultBytes = mac.doFinal(dataBytes);
// 编码为Base64字符串
String encodedResult = Base64.getEncoder().encodeToString(resultBytes);
Log.d("", "HMAC-SHA256 Base64: " + encodedResult);
return encodedResult;
}
}
调用
public void testSha() {
try {
String message = "Hello";
String secret = "key";
String hmac = EncryptUtils.HmacSHA256(message, secret);
// 输出xwufTWZb1il0r8g1gt6BDnKkGljbgsU4qdc0ySZtMh4=
Log.d("", "HmacSHA256: " + hmac);
} catch (Exception e) {
e.printStackTrace();
}
}
Python实现HMAC-SHA256
实现思路
在Python中,在实现HMAC-SHA256加密并对其进行Base64编码时,你可以使用hashlib库来计算HMAC-SHA256,然后使用base64库来进行Base64编码。
步骤
-
安装必要的库
首先,确保你的Python环境中已经安装了hashlib和base64库。这两个库通常是Python标准库的一部分,因此通常不需要单独安装。 -
创建HMAC对象:使用hmac.new()函数创建一个新的HMAC对象。你需要提供密钥(key)、消息(message),以及一个散列函数(在这个例子中是hashlib.sha256)。
-
获取HMAC的二进制数据:通过调用digest()方法,获取HMAC的二进制数据。
-
Base64编码:使用base64.b64encode()方法将HMAC的二进制数据编码为Base64字符串。最后,如果你需要将结果作为字符串处理,可以使用.decode()方法将字节串转换为普通字符串。
注意事项
确保密钥(key)和消息(message)在传入函数前已经是以字符串形式提供的。在函数内部,我们使用.encode()方法将它们转换为字节串,因为Python的hmac和hashlib库都要求输入为字节串。
在实际应用中,密钥应该保密并安全地存储。不要硬编码密钥在代码中,特别是在生产环境中。
如果需要与外部系统交互,确保双方使用相同的密钥和算法设置,以避免安全漏洞。
代码
import hashlib
import hmac
import base64
def hmac_sha256_base64(message, key):
# 创建一个新的hmac对象,使用SHA256作为hash函数
hmac_obj = hmac.new(key.encode('utf-8'), message.encode('utf-8'), hashlib.sha256)
# 获取HMAC的二进制数据
hmac_digest = hmac_obj.digest()
# 将HMAC的二进制数据转换为Base64编码的字符串
hmac_base64 = base64.b64encode(hmac_digest)
# 返回Base64编码的字符串
return hmac_base64.decode() # 将字节串解码为字符串
rt = hmac_sha256_base64('Hello', 'key')
print(rt)
# 输出xwufTWZb1il0r8g1gt6BDnKkGljbgsU4qdc0ySZtMh4=
作者:帅得不敢出门