ColdFusion二进制解码vs php包(H*)

ColdFusion二进制解码vs php包(H*),php,coldfusion,hmacsha1,Php,Coldfusion,Hmacsha1,我需要在ColdFusion中从40个字符的键创建一个20个字符的可用键。这是为了计算HMAC签名 我调用的服务器使用php包(H*)函数验证签名 当我试图创建密钥来计算HMAC密封时,我无法计算PHP返回的相同密钥。Pack(H*)返回20个字符,但CF(binaryDecode())返回18个字符,其中一些被忽略或结果不同。签名无效 如果我用这个来计算一个20个字符的键 “325A16A325127FD42B700D4810E83F6312877B92”: PHP返回:2Z�%�+p H�?

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

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

当我试图创建密钥来计算HMAC密封时,我无法计算PHP返回的相同密钥。Pack(H*)返回20个字符,但CF(binaryDecode())返回18个字符,其中一些被忽略或结果不同。签名无效

如果我用这个来计算一个20个字符的键

“325A16A325127FD42B700D4810E83F6312877B92”:

PHP返回:2Z�%�+p H�?C�{�, 使用CF时: 2Z�%�+酸碱度�?C�{�

使用CF:

local.key   = toString(binaryDecode("325A16A325127FD42B700D4810E83F6312877B92", "hex"));
writeDump(local.key);
更多代码:

PHP

返回: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*mail@gmail.com**********";
local.sign = local.crypto.hmacSha1(local.key, local.str, "hex");

Return:ff8d510f348d1a9b3652b33b8e7780c9f8d4536e

问题在于如何传入十六进制键以及如何使用它创建签名创建secretKeySpec的,操作提供的值——在本例中——生成一个完全不同的密钥。这就是签名不匹配的原因:

    var secretkeySpec = createObject( "java", "javax.crypto.spec.SecretKeySpec" ).init(
        toBinary( toBase64( key ) ), // Changes the key value
        javaCast( "string", algorithm )
    );
从技术上讲,您可以通过取消所有转换,而只是从十六进制解码密钥来实现:

    // 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 )
    );
然后传入一个原始的十六进制键

crypto.hmacSha1("325A16A325127FD42B700D4810E83F6312877B92",value, "hex");
生成与PHP相同的结果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*mail@gmail.com**********";
local.sign = local.crypto.hmacSha1(local.key, local.str, "hex");

但是,您可能需要修改组件处理键的方式。因此,它的脆弱性要小一些。例如,您可以修改hmac*函数以接受二进制,或者甚至通过使用
参数支持不同的编码。编码
。这一切取决于您打算如何使用CFC。

忽略它们的显示方式。实际的二进制值相同,都是20个字符-或者CF arrayLen是20。“签名无效。”也许问题在于签名计算的其余部分?代码的其余部分是什么?这不一样,请参阅本项目中带有CF9的p和HI'm之间的空格,我使用Ben Nadel提供的de crypto.cfc来计算HMAC-SHA1.local.sign=local.crypto.hmacSha1(local.key,'my text content',“hex”);实际值才是重要的。两者都有相同的长度,并且在重新编码为十六进制或base64时产生相同的值。因此我强烈怀疑这只是它们在显示“人性友好”时的不同视图。你可以发布一个虚拟示例来展示PHP和HMAC结果的不同吗?谢谢你的帮助,我会尝试用这种方式进行搜索。是的!…你完全正确。非常感谢你的帮助。不客气。第一篇文章很好,顺便说一句!很高兴在这样的线程上提供帮助。欢迎来到S.O.:-)
crypto.hmacSha1("325A16A325127FD42B700D4810E83F6312877B92",value, "hex");