【问题标题】:coldfusion hashing and difference between hmacSHA256 and SHA256冷融合散列和hmacSHA256和SHA256的区别
【发布时间】:2014-11-17 16:34:06
【问题描述】:

我想模仿的是这个 PHP 功能

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

“HmacSHA256”和“sha256”有区别吗?

这可行 - 但不会给我相同的结果:

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

这告诉我“sha256”不可用(因为我没有使用企业)

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

在没有企业的情况下我有什么方法可以做到这一点?没有我可以绑定的 java lib 用于编码吗?

谢谢

【问题讨论】:

    标签: php encoding coldfusion hmac sha256


    【解决方案1】:

    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 用于新应用程序。

    【讨论】:

    • 是的 leigh - 你是绝对正确的。这是我们解决方案的一部分。 - 也许你可以回答这个.... toBase64( toBinary( hmac( a, b, 'HmacSHA256', 'us-ascii' ) ) );似乎会将返回值从 hmac 转换为二进制 - 这不应该是相同的结果吗?不是这样的。 - 感谢您的投入。
    • Nope :) 如何 解码字符串会有很大的不同。 toBinary() 期望输入是 base64 编码的。你正在传递十六进制。它不会导致错误。但是,decoded 值将是错误的。这就是为什么你会得到不同的结果。顺便说一句,toBase64 已弃用。对于新应用,请改用binaryEncode
    • 谢谢!!!我在使用 C# 编写的示例时遇到了同样的问题
    【解决方案2】:

    这是我最近使用的通用版本。还没有测试过这个确切的代码,但试一试。我将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>

    【讨论】:

    • ya - 这个概念有效。我们找到了一个 cfc(它可能是 crypto.cfc,不确定它来自哪里。)它使用相同的概念,但它具有抽象的步骤以允许不同的编码。谢谢...
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-07
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      • 2011-02-26
      • 1970-01-01
      相关资源
      最近更新 更多