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


前提是我传入的secret, text都是一样的,java版的hmacSha1和php版hash_hmac(给传的是sha1)得出的部分值不一样。代码如下:
java代码:

   
  public static byte[] hmac_sha1(byte[] keyBytes, byte[] text)
  
throws NoSuchAlgorithmException, InvalidKeyException {
Mac hmacSha1;
try {
hmacSha1 = Mac.getInstance("HmacSHA1");
} catch (NoSuchAlgorithmException nsae) {
hmacSha1 = Mac.getInstance("HMAC-SHA-1");
}
SecretKeySpec macKey = new SecretKeySpec(keyBytes, "RAW");
hmacSha1.init(macKey);
return hmacSha1.doFinal(text);
}

byte[] hash = hmac_sha1(secret, text);

php代码:

   
  public function hmac($data, $secret, $hashFunct = 'sha1', $rawOutput = true) {
  

if (!in_array($hashFunct, hash_algos())) {
$hashFunct = 'sha1';
}

return hash_hmac($hashFunct, $data, $secret, $rawOutput);
}

$hash = hmac($text,$secret);
$hash = str_split($hash);
foreach ($hash as $index=>$value) {
$hash[$index] = ord($value);
}

经过多次测试发现php里得出的$hash里的元素值如果大于128时与java版就不一样了,我把$hash[$index] = ord($value);换成:

   
  if(ord($value)>128)
  
$hash[$index] = ord($value)-128*2;
else
$hash[$index] = ord($value);

计算的结果就一样了,请知道原理的人帮忙给解释一下吧,虽然这样拼凑实现了项目需求,但是还是想知道真正的原因!

java php 算法

瑞凤的鸡蛋卷 12 years, 9 months ago

Your Answer