我们的 API 平台使用 CMAC-AES 哈希作为请求的签名。我们有可用于在 Java 和 .NET 中创建此散列的库,但也需要为 PHP 找到解决方案。问题是我找不到任何似乎能够可靠地生成与在我们的服务器上或通过 Java/.NET 库生成的 CMAC 相匹配的散列的东西。
我找到的唯一库是 CryptLib,一个 alpha 库。
https://github.com/ircmaxell/PHP-CryptLib
但它没有生成相同的哈希值,而且我对加密技术的了解还不够好,无法理解原因(它强制 AES 的 block 大小为 16,而我在网上发现的 AES block 大小为 128)。
我还有其他途径吗?
最佳答案
上面的 PHP-CryptLib 库最终会工作得很好。我的问题只是我自己在二进制数据和十六进制数据方面的错误。
使用库一提供的测试数据
require_once 'lib/CryptLib/bootstrap.php';
$hasher = new CryptLib\MAC\Implementation\CMAC;
$key = '2b7e151628aed2a6abf7158809cf4f3c'; // from test/Data/Vectors/cmac-aes ...
$msg = '6bc1bee22e409f96e93d7e117393172a'; // from test/Data/Vectors/cmac-aes ...
$cmac = $hasher->generate($msg,$key);
echo $cmac;
// $cmac should be 070a16b46b4d4144f79bdd9dd04a287c
// actually getting ¢ nd{þ¯\ ¥á¼ÙWß
除了 CMAC 哈希器使用二进制数据而不是 ascii 字符,因此需要使用 pack() 对其进行打包:
$key = pack("H*", '2b7e151628aed2a6abf7158809cf4f3c');
$msg = pack("H*", '6bc1bee22e409f96e93d7e117393172a');
我的具体真实案例是尝试散列任意字符串,例如:
$msg = 'Client|Guid-023-23023-23|Guid-0230-2402-252|string|123456|2012-11-08T20:55:34Z';
为此我需要一个这样的函数:
function pack_str($str) {
$out_str = "";
$len = strlen($str);
for($i=0; $i<$len; $i++) {
$out_str .= pack("c", ord(substr($str, $i, 1)));
}
return $out_str;
}
一旦数据用该函数打包并通过哈希器运行,我就得到了我期望的 CMAC 哈希。
关于php - 使用 PHP 进行 CMAC-AES 散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13299876/