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
