Php
在php中hash_hmac函数就能将HMAC和一部分哈希加密算法相结合起来实现HMAC-SHA1 HMAC-SHA256 HMAC-MD5等等算法。
函数介绍如下:
string hash_hmac(string $algo, string $data, string $key, bool $raw_output = false)
algo:要使用的哈希算法名称,可以是上述提到的md5,sha1等
data:要进行哈希运算的消息,也就是需要加密的明文。
key:使用HMAC生成信息摘要是所使用的密钥。
raw_output:该参数为可选参数,默认为false,如果设为true,则返回原始二进制数据表示的信息摘要,否则返回16进制小写字符串格式表示的信息摘要(注意是16进制数,而非简单的字母加数字)。
另外:如果algo参数指定的不是受支持的算法,将返回false。
<?php
$data = "b-b7a3b7cc7a57fb0433fef3252c60a105";
$key = "d25b2cb97c0b5a82d887ebbc0580cce0";
$str = hash_hmac("sha1", $data, $key);
echo $str."\n";
?>
运行结果:
39b46d318c7338b034d1f623a551b8ddcadb7ac0
Java
public static void main(String[] args) throws Exception {
String key = "d25b2cb97c0b5a82d887ebbc0580cce0";
String data = "b-b7a3b7cc7a57fb0433fef3252c60a105";
String result = getSignature(data, key);
System.out.println(result);
}
/**
* 使用 HMAC-SHA1 签名算法对data进行签名
* @param data 被签名的字符串
* @param key 密钥
* @return 加密后的字符串
*/
public static String getSignature(String data, String key) throws Exception {
//根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
SecretKeySpec signinKey = new SecretKeySpec(key.getBytes(), HmacSHA1);
//生成一个指定 Mac 算法 的 Mac 对象
Mac mac = Mac.getInstance(HmacSHA1);
//用给定密钥初始化 Mac 对象
mac.init(signinKey);
//完成 Mac 操作
byte[] rawHmac = mac.doFinal(data.getBytes());
String hexBytes = byte2hex(rawHmac);
return hexBytes;
}
private static String byte2hex(final byte[] b) {
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++) {
// 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式。
stmp = (java.lang.Integer.toHexString(b[n] & 0xFF));
if (stmp.length() == 1) {
hs = hs + "0" + stmp;
} else {
hs = hs + stmp;
}
}
return hs;
}
运行结果:
39b46d318c7338b034d1f623a551b8ddcadb7ac0