php - ColdFusion binaryDecode 与 php pack(H*)

标签 php coldfusion hmacsha1

我需要在 ColdFusion 中从 40 个字符的 key 创建一个 20 个字符的可用 key 。计算HMAC签名。

我调用的服务器使用 php 包 (H *) 函数验证签名。

当我尝试创建 key 来计算 HMAC 印章时,我无法计算出与 PHP 返回的 key 相同的 key 。 Pack(H*)返回的是20个字符,但是CF(binaryDecode()),返回的是18个,有些被忽略或者结果不同。签名无效。

例如:如果我尝试用这个计算 20 个字符的 key

"325A16A325127FD42B700D4810E83F6312877B92":

PHP return : 2Z�%�+p H�?c�{�, and with CF : 2Z�%�+pH�?c�{�

$key = "325A16A325127FD42B700D4810E83F6312877B92";
$test = pack('H*',$key);
var_dump($test);

使用CF:

local.key   = toString(binaryDecode("325A16A325127FD42B700D4810E83F6312877B92", "hex"));
writeDump(local.key);

更多代码:

PHP。

function hmac_sha1 ($key, $data) {

    $length = 64; // block length for SHA1
    if (strlen($key) > $length) { $key = pack("H*",sha1($key)); }
    $key  = str_pad($key, $length, chr(0x00));
    $ipad = str_pad('', $length, chr(0x36));
    $opad = str_pad('', $length, chr(0x5c));
    $k_ipad = $key ^ $ipad ;
    $k_opad = $key ^ $opad;

    return sha1($k_opad  . pack("H*",sha1($k_ipad . $data)));


}
$key = "325A16A325127FD42B700D4810E83F6312877B92";
$validKey = pack('H*',$key);
$str = "7464052*08/10/2018:14:22:30*65.25EUR*AA123**3.0*FR*carmen*<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a5c8c4ccc9e5c2c8c4ccc98bc6cac8" rel="noreferrer noopener nofollow">[email protected]</a>**********";
$sign = hmac_sha1($validKey, $str);
$test = pack('H*',$key);

返回:23e7db20da9b58a47e27c151a65c2393a08ee4f5

local.key = toString(binaryDecode("325A16A325127FD42B700D4810E83F6312877B92","hex"));
local.crypto = createObject("miscellaneous.crypto").init();
local.str = "7464052*08/10/2018:14:22:30*65.25EUR*AA123**3.0*FR*carmen*<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="630e020a0f23040e020a0f4d000c0e" rel="noreferrer noopener nofollow">[email protected]</a>**********";
local.sign = local.crypto.hmacSha1(local.key, local.str, "hex");

返回:ff8d510f348d1a9b3652b33b8e7780c9f8d4536e

最佳答案

问题在于您如何传入十六进制 key 以及如何 custom component在创建签名时使用它。 _getMacInstance() 中的代码创建了 SecretKeySpec,操作提供的值 - 在本例中 - 生成一个完全不同的 key 。这就是签名不匹配的原因:

    var secretkeySpec = createObject( "java", "javax.crypto.spec.SecretKeySpec" ).init(
        toBinary( toBase64( key ) ), // Changes the key value
        javaCast( "string", algorithm )
    );

技术上您可以通过摆脱所有转换并仅从十六进制解码 key 来使其工作:

    // Create the specification for our secret key.
    var secretkeySpec = createObject( "java", "javax.crypto.spec.SecretKeySpec" ).init(
        binaryDecode(arguments.key, "hex"), // Decodes raw HEX key
        javaCast( "string", algorithm )
    );

然后传入一个原始的十六进制 key

crypto.hmacSha1("325A16A325127FD42B700D4810E83F6312877B92",value, "hex");

产生与 PHP 相同的结果 23e7db20da9b58a47e27c151a65c2393a08ee4f5

但是,您可能想要修改组件处理键的方式。所以它的脆性要小一些。例如,您可以修改 hmac* 函数以接受二进制,甚至可以使用 arguments.encoding 支持不同的编码。一切都取决于您打算如何使用 CFC。

关于php - ColdFusion binaryDecode 与 php pack(H*),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52717656/

相关文章:

php - 使用 PHP GRPC Spanner Google Cloud 时出现错误

php - 警告 : Illegal string offset (seems it's quite different)

php - 如何插入多条记录

javascript - VBA 中的 Base64 HMAC SHA1 字符串

c++ - Crypto++ pbkdf2 输出不同于 Rfc2898DeriveBytes (C#) 和 crypto.pbkdf2 (JavaScript)

php - 使用 css 用作单选按钮时突出显示选定的 div

coldfusion - 使用 header 和参数创建 chttp

arrays - 循环 ColdFusion 结构

java - Coldfusion XOR 从 java 翻译而来

java - 如何将 Node JS HMAC 签名创建更改为 Java