问题描述
使用 EncryptByKey 和 cfqueryparam 运行查询时,该值似乎被截断了。
例如:
<cfset customer_number = 123 />
<cfset soc_sec_number = "123-45-6789" />
<cfquery datasource="web_applications">
OPEN SYMMETRIC KEY SSNKey
DECRYPTION BY CERTIFICATE SSNCert;
UPDATE
Customers
SET
SSN_Encrypted = EncryptByKey( Key_GUID( 'SSNKey' ),<cfqueryparam cfsqltype="CF_sql_VARCHAR" value="#soc_sec_number#" > )
WHERE
customer_number = <cfqueryparam cfsqltype="CF_sql_VARCHAR" value="#customer_number#" > ;
CLOSE SYMMETRIC KEY SSNKey;
</cfquery>
解密后的结果数据库值为“1”。如果我删除 <cfqueryparam>
,整个值将毫无问题地存储。此外,此问题仅在与 EncryptByKey
结合使用时才会发生。
我们使用的是 CF 2018 和 sql 2016。昨天才开始出现这个问题。它可能有关系也可能没有关系,但我们的力量昨天已经失去了。是否有可能是某些 cf 文件已损坏,或者某些编码设置已更改?我将如何检查这个?
更新:
执行以下查询时:
<cfquery name="get_ssn">
OPEN SYMMETRIC KEY SSNKey
DECRYPTION BY CERTIFICATE SSNCert;
SELECT
CONVERT( VARCHAR,DecryptByKey( [ssnEncrypted] ) ) AS decrypted_ssn
FROM
customers
WHERE
Customer.customer_number= <cfqueryparam cfsqltype="CF_sql_VARCHAR" value="#customer_number#" > ;
CLOSE SYMMETRIC KEY SSNKey;
</cfquery>
decrypted_ssn
的结果值如下:
<cfdump var="#get_ssn.decrypted_ssn#"> -> 123-45-6789
<cfdump var="#right(get_ssn.decrypted_ssn,4)#"> -> 89
in sql studio -> 1
此时我怀疑存在编码问题,因为 Coldfusion 返回完整值但认为 right(123-45-6789,4)
是 89
而不是 6789
我不知道如何测试这个理论。
更新:
我已经确认这个问题出现在多个表上,并且有多个对称密钥。
再次更新:
使用cfqueryparam
保存的字符串,当使用LEN()
命令时,输出22,而WITHOUT cfqueryparam
的值输出11。
更新: 我遵循了解决方案 Here,它似乎解决了我的问题。但我想了解这是怎么发生的。直到昨天,当电源断电并且服务器重新启动时,连接似乎才需要这样做。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)