我试图模仿这个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可以用于编码?
感谢
答案 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 - 试图更容易和更简洁地访问这些库。