0

CF10 AES-256 (AES/CBC/PKCS5Padding アルゴリズム) を使用して、暗号化された文字列を MySQL 列 (BLOB) に格納しようとすると、次のエラーが発生します。

java.lang.String は [B にキャストできません

デフォルトの UU および base64 エンコーディングを試してみましたが、同じエラーが発生しました (半関連 - UU よりも base64 に保存する利点、またはその逆の利点はありますか?)。

現在の私のコードは、単純なテスト更新クエリです。cfqueryparam で cfsqltype を blob と varchar の両方に設定しようとしました (そして、cfqueryparam を試しませんでした)。

ジェイソンからの提案の後、私が今持っている私のコードは次のとおりです。ただし、復号化された文字列を取り戻すことに固執しています。

<cfset thePlainText = '010101939393923490 this is my string to encrypt'/>
<cfset theKey = application.sec.AESKey256/>
<cfset theAlgorithm  = "AES/CBC/PKCS5Padding" />
<cfset theEncoding  = "base64" />
<cfset encryptedString = toBinary(encrypt(thePlainText, theKey, theAlgorithm, theEncoding)) />

<cfquery name="upd" datasource="#myds#">
  UPDATE table SET
    field = <cfqueryparam cfsqltype="cf_sql_blob" value="#encryptedString#"/>
   WHERE id=1
</cfquery>

その後、それはすべて順調です。データベースに blob フィールドがあり、データを格納しています。したがって、それを選択し直したい場合は、問題が発生します。

<cfquery name="qry" datasource="#myds#">
  SELECT field
    FROM table
   WHERE id=1
</cfquery>

私はこれがうまくいくと思った:

<cfset decryptedString = decrypt(toString(qry.field), theKey, theAlgorithm, theEncoding)/>

しかし、「入力文字列を暗号化または復号化しようとしているときにエラーが発生しました: 入力と出力のエンコーディングが同じではありません」というメッセージが表示されます。

暗号化された文字列 var と qry クエリをダンプすると、暗号化された文字列とダンプされたデータは実際には異なります

解決済み (toBase64 ではなく toString)

<cfset decryptedString = decrypt(toBase64(qry.field), theKey, theAlgorithm, theEncoding)/>
4

1 に答える 1

2

文字列を BLOB フィールドに格納しようとしています。ColdFusion の encrypt() メソッドは、バイナリ オブジェクトではなく文字列を返します。そのため、代わりに VARCHAR に格納するか、バイナリ オブジェクトに変換することができます。

 <cfset cipher = encrypt("... blah blah blah") />
 <cfset binCipher = binaryDecode(cipher, "Base64") />

次に、binCipher を格納します。

encrypt() 呼び出しで引き続き Base64 エンコーディングを使用します。

于 2013-05-30T16:27:32.900 に答える