我正在将一个站点从CF8移动到CF10,其中一个问题是使用mysql中的aes_encrypt检索mysql中存储的数据。该列是blob。当我访问检索解密字符串的CFC时,我收到了一个错误的二进制对象:
ByteArray objects cannot be converted to strings.
在CF8系统上,我可以输出:
<cfoutput>#qryResult.decryptedString#</cfoutput>
在CF10下,我必须将其包装在toString()
中<cfoutput>#toString(qryResult.decryptedString)#</cfoutput>
我不知道这是否是CF,MySQL或驱动程序问题,以及解决问题的最佳方法,或者我是否需要采取另一个步骤来转换此网站。换句话说,“toString()”是正确的解决方案,还是有一个数据库参数可以放入连接字符串中以保持原样?
答案 0 :(得分:3)
我使用ColdFusion 8和10(针对同一个数据库)运行了一些测试,得到了类似的结果。解密结果在ColdFusion 8(和MySQL)中以String的形式返回,但在ColdFusion 10中作为二进制文件返回。所以我怀疑它是驱动程序错误,或者可能是故意更改(我不确定)。 / p>
测试查询
<cfquery name="qTest" datasource="mySQL51">
SELECT AES_DECRYPT(encryptedColumn, 'xxxxxxx') AS DecryptedResult
FROM test
WHERE ID = 1
</cfquery>
<cfoutput>
class name = #qTest.decryptedResult[1].getClass().name#
</cfoutput>
<强>结果
ColdFusion 8 / class name = java.lang.String
ColdFusion 10 / class name = [B (ie binary/byte array)
除了测试不同的驱动程序之外,最简单的解决方案是将值转换为现在正在执行的字符串。您可以在SQL中进行转换:
SELECT CAST(AES_DECRYPT(encryptedColumn, 'xxx') AS CHAR) AS DecryptedResult
..或CF代码。请务必指定类似UTF-8
的编码 <!--- if result is binary, convert it to a string first --->
<cfif IsBinary( qTest.decryptedResult )>
<cfset decryptedString = charsetEncode( qTest.decryptedResult, "utf-8" )>
</cfif>