2

サイトを CF8 から CF10 に移動していますが、発生した問題の 1 つは、mysql で aes_encrypt を使用して mysql に格納されたデータを取得することです。列はブロブです。復号化された文字列を取得する 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 に答える