coldfusion 10和mysql - 解密以前存储的数据的问题

时间:2012-12-10 21:25:52

标签: mysql coldfusion aes coldfusion-10

我正在将一个站点从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()”是正确的解决方案,还是有一个数据库参数可以放入连接字符串中以保持原样?

1 个答案:

答案 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>