CF10 AES加密java.lang.String无法转换为[B错误存储数据时

时间:2013-05-30 16:13:30

标签: mysql coldfusion aes coldfusion-10

使用CF10 AES-256(AES / CBC / PKCS5Padding算法)我试图将加密的字符串存储在MySQL列(BLOB)中并收到此错误:

java.lang.String无法强制转换为[B

我尝试过默认的UU和base64编码并得到相同的错误(半相关 - 在U64上存储在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>

之后,这一切都很好。我在db中有一个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)/>

1 个答案:

答案 0 :(得分:2)

您正在尝试将字符串存储在BLOB字段中。 ColdFusion的encrypt()方法返回一个字符串,而不是二进制对象。因此,您可以将其存储在VARCHAR中,也可以将其转换为二进制对象。

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

然后存储binCipher。

继续在encrypt()调用中使用Base64编码。