如何在ColdFusion&中填充null / zero-bytes的字符串MacOS和Windows上的CF之间的区别

时间:2013-12-06 22:41:08

标签: encryption coldfusion

我无法理解如何用空字节填充CF中的字符串。在Java中,我会这样做......

String ZeroPad = "";
for (int i = 0; i < 32; i++)
    ZeroPad = ZeroPad + "\0";
String strKey = strUsername + strPassword + ZeroPad;
strKey = strKey.substring(0, 32);

但是在ColdFusion中执行以下操作会产生类似“\ 0 \ 0 ...”的内容,而不是空字节。

<cfset var key = arguments.username&arguments.password/>
<cfloop condition="#len(key)# less than 32">
    <cfset key = key & "\0"/>
</cfloop>
<cfset key = key.substring(0,32)/>

持续存在的问题。好的,我已经将我的CFML更新为...

<cfset var strB = createObject("java", "java.lang.StringBuilder")/>

<cfloop from=1 to=32 index="i">
    <cfset zeroPad = zeroPad & URLDecode("%00")/>
</cfloop>

<cfset strB.append(arguments.username)/>
<cfset strB.append(arguments.password)/>
<cfset strB.append(zeroPad)/>

<cfif strB.length() GT 32>
    <cfset key = strB.substring(0,32)/>
<cfelse>
    <cfset key = strB.toString()/>
</cfif>

生成的密钥用于AES加密。在我的本地开发机器(Mac OS X Mavericks)上,这很好用,我可以用生成的密钥加密。但是,在我的生产环境(Windows Server 2008)上,我收到错误“密钥大小无效”。两者的密钥大小显示为32,我感到很沮丧。

1 个答案:

答案 0 :(得分:2)

我过去曾使用this tip,即:URLDecode("%00", "utf-8")

<强>更新

由于encrypt()函数始终将纯文本输入解释为UTF-8字符串,因此您还可以使用charsetEncode(bytes, "utf-8")从单个元素字节数组创建空字符。

 charsetEncode( javacast("byte[]", [0] ), "utf-8");