使用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)/>
答案 0 :(得分:2)
您正在尝试将字符串存储在BLOB字段中。 ColdFusion的encrypt()方法返回一个字符串,而不是二进制对象。因此,您可以将其存储在VARCHAR中,也可以将其转换为二进制对象。
<cfset cipher = encrypt("... blah blah blah") />
<cfset binCipher = binaryDecode(cipher, "Base64") />
然后存储binCipher。
继续在encrypt()调用中使用Base64编码。