EncryptByKey加密字符串丢失问题求助:超过26位仅加密前26位
解决EncryptByKey截断长字符串的问题
这问题我之前排查过好几次,核心原因就是数据类型的隐式长度限制在搞事情!你现在遇到的超过26位只加密前26位的情况,大概率是以下两个环节出了问题:
问题根源分析
- 变量声明长度不足:如果你的
@AccountName是用DECLARE @AccountName nvarchar;或者DECLARE @AccountName nvarchar(26);声明的,那超过长度的部分会直接被截断,加密自然只能处理前26位。 - 加密时的隐式转换截断:SQL Server中,当你使用
CAST但不指定长度时,默认会使用nvarchar(30)(不同场景可能有差异),如果你的字符串超过这个长度,也会被截断。
具体解决方案
1. 修正变量声明
首先确保@AccountName的长度足够覆盖你的业务场景,直接用nvarchar(MAX)是最稳妥的(或者根据实际需求设置比如nvarchar(500)):
DECLARE @AccountName nvarchar(MAX);
2. 加密时显式指定足够长度
在加密表达式里,强制把处理后的字符串转换为nvarchar(MAX),避免隐式截断:
AccountName = EncryptByKey( Key_GUID('SKEDB_BenName_11'), CAST(UPPER(LTRIM(RTRIM(@AccountName))) AS nvarchar(MAX)) )
3. 验证目标字段类型
最后别忘了检查存储加密后数据的AccountName字段,必须是varbinary(MAX)类型——因为EncryptByKey返回的加密数据长度会随输入字符串变长而增加,固定长度的varbinary会截断加密结果,导致解密后数据不完整。
测试验证
你可以用一个超过26位的测试字符串来验证:
DECLARE @TestAccountName nvarchar(MAX) = 'ThisIsAVeryLongAccountNameThatIsOver26Characters'; SELECT EncryptByKey(Key_GUID('SKEDB_BenName_11'), CAST(UPPER(LTRIM(RTRIM(@TestAccountName))) AS nvarchar(MAX))) AS EncryptedValue, DecryptByKey(EncryptByKey(Key_GUID('SKEDB_BenName_11'), CAST(UPPER(LTRIM(RTRIM(@TestAccountName))) AS nvarchar(MAX)))) AS DecryptedValue;
如果解密后能完整还原测试字符串,就说明问题解决了。
内容的提问来源于stack exchange,提问作者Ritesh Gore
相关产品推荐
相关产品推荐

