2

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

4

1 回答 1

3

我用 ColdFusion 8 和 10(针对同一个数据库)进行了一些测试,得到了相似的结果。解密的结果在 ColdFusion 8(和 MySQL)中作为字符串返回,但在 ColdFusion 10 中作为二进制返回。所以我怀疑这是驱动程序错误,或者可能是故意更改(我不确定)。

测试查询

    <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>
于 2012-12-11T05:04:42.907 回答