MS SQL Server EncryptByKey - строка или двоичные данные будут усечены
Теоретически varchar(max)
а также varbinary(max)
столбцы должны иметь возможность хранить до 2 ГБ данных, но я не могу хранить строку в юникоде длиной 5000 символов.
Я просмотрел другие вопросы по этой теме, и все они предлагают проверить размеры столбцов. Я сделал это и вижу, что все связанные столбцы объявлены с максимальным размером.
Ключевое отличие от похожих вопросов заключается в том, что при хранении я шифрую данные, используя 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] Строковые или двоичные данные будут усечены.
Как зашифровать и хранить большие строки (около 5 тыс. Символов Юникода)?
1 ответ
Поэтому я столкнулся с этой проблемой при использовании С# и попытке зашифровать и вставить длинную строку 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 ;