【问题标题】:MS SQL Server EncryptByKey - String or binary data would be truncatedMS SQL Server EncryptByKey - 字符串或二进制数据将被截断
【发布时间】:2018-04-23 10:05:15
【问题描述】:

理论上 varchar(max)varbinary(max) 列应该能够存储多达 2GB 的数据,但我无法存储 5000 个字符长的 unicode 字符串。

我查看了有关此主题的其他问题,他们都建议检查列大小。我已经这样做了,并看到所有相关列都声明为最大大小。

与类似问题的主要区别在于,在存储时我使用EncryptByKey 加密数据,我认为这是我正在寻找的瓶颈。从 MSDN 我知道 EncryptByKey 的返回类型的最大大小为 8000 字节,目前尚不清楚 @cleartext 参数的最大大小是多少,但我怀疑它是相同的。

以下代码给了我错误:

OPEN SYMMETRIC KEY SK1 DECRYPTION BY CERTIFICATE Cert1;

DECLARE @tmp5k AS NVARCHAR(max);
SET @tmp5k = N'...5000 characters...';
SELECT EncryptByKey(Key_GUID('SK1'), @tmp5k);
GO

[22001][8152] 字符串或二进制数据将被截断。

如何加密和存储大字符串(大约 5k unicode 字符)?

【问题讨论】:

  • 问题是ENCRYPTBYKEY的返回值;正如您所说,这是 8,000 字节。包含 5,000~ 个字符的 nvarchar 将是 10,000~ 个字节,因此您有 2,000~ 个字节的截断。
  • 好的,有没有办法加密8000多字节?
  • 我用谷歌搜索了一下,似乎答案是否定的,不是开箱即用的。一种方法是“切片和切块”您的数据;在您的情况下,将其分成 4,000 个(或更少)字符块并对其进行加密,然后将它们解密并将它们连接在一起。

标签: sql-server varcharmax encryptbykey


【解决方案1】:

所以我在使用 C# 并尝试加密并将长 JSON 字符串插入 SQL 时遇到了这个问题。最终的工作是将纯文本字符串转换为二进制,然后使用相同的 SQL EncryptByKey 函数来代替。

如果你这样做只是SQL,我认为你可以使用这个函数:

CONVERT(VARBINARY(MAX), @tmp5k) AS ToBinary

所以使用我们的例子:

OPEN SYMMETRIC KEY SK1 DECRYPTION BY CERTIFICATE Cert1;

DECLARE @tmp5k AS NVARCHAR(max);
SET @tmp5k = N'...5000 characters...';
SELECT EncryptByKey(Key_GUID('SK1'), CONVERT(VARBINARY(MAX), @tmp5k));
GO

下面是一个使用 SQL 将二进制文件转换回字符串的示例:

CONVERT(VARCHAR(100), CONVERT(VARBINARY(100), @TestString)) AS StringFromBinaryFromString ;

【讨论】:

    猜你喜欢
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多