【问题标题】:SecretKeySpec for ColdFusionColdFusion 的 SecretKeySpec
【发布时间】:2021-09-09 05:46:02
【问题描述】:

我正在尝试将此代码转换为java,但结果不准确

private String hmacDigest(String msg, String keyString, String algo) throws Exception {
    String digest = null;
    SecretKeySpec key = new SecretKeySpec((keyString).getBytes("UTF-8"), algo);
    Mac mac = Mac.getInstance(algo);
    mac.init(key);

    byte[] bytes = mac.doFinal(msg.getBytes("ASCII"));

    StringBuffer hash = new StringBuffer();
    for (int i = 0; i < bytes.length; i++) {
        String hex = Integer.toHexString(0xFF & bytes[i]);
        if (hex.length() == 1) {
            hash.append('0');
        }
        hash.append(hex);
    }
    digest = hash.toString();
    return digest;
}

我的 codfusion 一直在尝试

<cfset keybytes = BinaryDecode(SECRET_KEY, "Hex")>
<cfset databytes = CharsetDecode(data, "UTF-8")>
<cfset secret = createObject("java", "javax.crypto.spec.SecretKeySpec").Init(keybytes,"HmacSHA256")>
<cfset mac = createObject("java", "javax.crypto.Mac")>
<cfset mac = mac.getInstance("HmacSHA256")>
<cfset mac.init(secret)>
<cfset digest = mac.doFinal(databytes)>
<cfset result = BinaryEncode(digest, "Base64")>

我在java方面的知识非常有限,所以我不确定我这样做是对还是错

【问题讨论】:

标签: coldfusion lucee


【解决方案1】:

您混淆了字符串编码,因此 CFML 实际上使用的输入值与 java 代码不同。这就是您的结果不匹配的原因

  1. java 方法将密钥解码为“UTF-8”

    (keyString).getBytes("UTF-8")
    

    .. 但 CFML 使用“十六进制”

    <cfset keybytes = BinaryDecode(SECRET_KEY, "Hex")>
    
  2. java 方法将消息解码为“ASCII”

    msg.getBytes("ASCII")
    

    ...但 CFML 使用的是“UTF-8”

    CharsetDecode(data, "UTF-8")
    
  3. java 结果被编码为“十六进制”,但 CFML 使用的是“base64”

    BinaryEncode(digest, "Base64")
    
  4. \n 在 java 中被解释为换行符。它在 CF 中的工作方式不同。请改用chr(10)

虽然错误很容易修复,但甚至不需要 java 代码。请改用内置的HMAC 函数。它产生相同的结果。唯一的区别是 CF 以全部大写形式返回十六进制,因此您必须将其包装在 LCASE() 中才能完全匹配。

Lcase( HMac( messageString, keyAsString, algorithm, "ASCII") )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 2015-08-13
    • 2016-01-13
    相关资源
    最近更新 更多