hash hmac java_认证加密算法php hash_hmac和java hmacSha1的问题

public class Test{

public static void main(String[] args) throws Exception {

String postString = "abc";

String signature = ByteToHex(genHMAC(postString, "310A54B3C9C12920E1582E016F15DD441ACE8553769E8991")).toUpperCase();

}

/**

* 使用 HMAC-SHA1 签名方法对data进行签名

*

* @param data

* 被签名的字符串

* @param key

* 密钥

* @return

加密后的字符串

*/

public static byte[] genHMAC(String data, String key) {

byte[] result = null;

try {

//根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称

SecretKeySpec signinKey = new SecretKeySpec(hexString2Bytes(key), "HmacSHA1");

//生成一个指定 Mac 算法 的 Mac 对象

Mac mac = Mac.getInstance("HmacSHA1");

//用给定密钥初始化 Mac 对象

mac.init(signinKey);

//完成 Mac 操作

byte[] rawHmac = mac.doFinal(data.getBytes());

result = rawHmac;

} catch (NoSuchAlgorithmException e) {

System.err.println(e.getMessage());

} catch (InvalidKeyException e) {

System.err.println(e.getMessage());

}

if (null != result) {

return result;

} else {

return null;

}

}

public static byte[] hexString2Bytes(String src) {

int l = src.length() / 2;

byte[] ret = new byte[l];

for (int i = 0; i < l; i++) {

ret[i] = (byte) Integer

.valueOf(src.substring(i * 2, i * 2 + 2), 16).byteValue();

}

return ret;

}

// btye转换hex函数

public static String ByteToHex(byte[] byteArray) {

StringBuffer StrBuff = new StringBuffer();

for (int i = 0; i < byteArray.length; i++) {

if (Integer.toHexString(0xFF & byteArray[i]).length() == 1) {

StrBuff.append("0").append(

Integer.toHexString(0xFF & byteArray[i]));

} else {

StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));

}

}

return StrBuff.toString();

}

}

方法一:

$str = "abc";

$key = "310A54B3C9C12920E1582E016F15DD441ACE8553769E8991";

$decodedKey = pack("H*", $key); //十六进制转成字符串

$hash = bin2hex(hash_hmac("sha1", $str, $decodedKey, true));

方法二:

//字节数组转化为String类型的数据

function toStr($bytes) {

$str = '';

foreach($bytes as $ch) {

$str .= chr($ch);

}

return $str;

}

//字符串转十六进制

function String2Hex($string){

$hex='';

for ($i=0; $i < strlen($string); $i++){

$hex .= dechex(ord($string[$i]));

}

return $hex;

}

//十六进制转字符串

function Hex2String($hex){

$string='';

for ($i=0; $i < strlen($hex)-1; $i+=2){

$string .= chr(hexdec($hex[$i].$hex[$i+1]));

}

return $string;

}

$str = "abc";

$key = "310A54B3C9C12920E1582E016F15DD441ACE8553769E8991";

$decodedKey = pack("H*", $key); //十六进制转字符串

$hash = hash_hmac("sha1", $str, $decodedKey, true);

//字符串转字节数组,即ascii数组

$hashs = str_split($hash);

foreach ($hashs as $index => $value) {

if (ord($value) > 128) {

$hashs[$index] = ord($value) - 128 * 2;

} else {

$hashs[$index] = ord($value);

}

}

$signature = String2Hex(toStr($hashs));

echo $signature;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值