冷血哈希和hmacSHA256和SHA256之间的区别

时间:2014-11-17 16:34:06

标签: php encoding coldfusion hmac sha256

我试图模仿这个PHP功能

<?php
    base64_encode( hash_hmac( 'SHA256', $a, $b, true) );
?>

&#34; HmacSHA256&#34>之间有区别吗?和&#34; sha256&#34;?

这有效 - 但并没有给我相同的结果:

<cfscript>
    toBase64( hmac( a, b, 'HmacSHA256', 'us-ascii' ) );
</cfscript>
这告诉我&#34; sha256&#34;是不可取的(因为我不使用企业)

<cfscript>
    toBase64( hmac( a, b, 'SHA256', 'us-ascii' ) );
</cfscript>

如果没有企业我可以做任何事情吗?是不是有一个java lib可以用于编码?

感谢

3 个答案:

答案 0 :(得分:2)

CF documentation for hmac非常缺乏有用的细节。您的代码不起作用的原因是hmac()返回十六进制字符串。而对hash-hmac的PHP调用返回二进制。因此,您的CF脚本是base64编码完全不同的值。这就是两个结果不匹配的原因。

您需要先将十六进制字符串解码为二进制。然后将二进制编码为base64,结果将匹配:

resultAsHex = hmac("Well done is better than well said.", "key", "HmacSHA256");
finalValue = binaryEncode( binaryDecode(resultAsHex, "hex"), "base64" );
writeDump( finalValue );

另外,toBase64()已被弃用。文档建议将binaryEncode用于新应用程序。

答案 1 :(得分:1)

这是我最近使用过的通用版本。没有测试过这个确切的代码,但是试一试。我将SECRET_KEY的加密值存储在数据库中,以使其远离应用程序代码。

<cffunction name="HmacSHA256" access="public" output="false" returntype="string" hint="Generates HmacSHA256 string.">
    <cfargument name="message" type="string" required="true" hint="form data" />
    <cfset var HMAC_SHA256 = "HmacSHA256" />
    <cfset var SECRET_KEY = "{YOUR_SECRET_KEY}" />

    <cfset var secretKeySpec = createObject("java", "javax.crypto.spec.SecretKeySpec").init( SECRET_KEY.getBytes("UTF-8"), HMAC_SHA256 ) />
    <cfset var mac = createObject("java", "javax.crypto.Mac").getInstance(HMAC_SHA256) />
    <cfset mac.init( secretKeySpec ) />
    <cfset var rawHmac = mac.doFinal( arguments.message.getBytes("UTF-8") ) />
    <cfset var encoder = createObject("java", "sun.misc.BASE64Encoder") />
    <cfreturn encoder.encodeBuffer(rawHmac).replace("\n", "").replace("\r", "") />
</cffunction>

答案 2 :(得分:0)

看起来您可能需要install libraries才能获得sha256

  

ColdFusion 10引入了hmac()函数,用于生成安全的散列消息认证码(HMAC)。此功能使得处理第三方API变得更加容易。但是,在ColdFusion 10之前,您需要深入Java层来访问安全库。这个ColdFusion组件 - Crypto.cfc - 试图更容易和更简洁地访问这些库。