Sql server SQL Server encryptbycert封顶关闭
我的问题是,由于我工作场所的策略,我试图加密SQL Server数据库中的一列。我只能使用加密TDE的简单方法,因此我不可能使用EncryptByCert或EncryptByKey。我做得很好,因为文档显示上限为8000,这对于我们正在保存的数据来说已经足够了 碰巧的是,当我试图保存任何东西时,它的上限约为200个字符,生成一个514字节长的varbinary。514字节长度的varbinary可以很好地进行加密和解密,但不会增长或缩短,单个字符的计数与200个字符串的计数相同,使这些514字节成为二进制。在大约230个字符之后,我想要加密它,它只会将列保留为空Sql server SQL Server encryptbycert封顶关闭,sql-server,encryption,sql-server-2016-express,Sql Server,Encryption,Sql Server 2016 Express,我的问题是,由于我工作场所的策略,我试图加密SQL Server数据库中的一列。我只能使用加密TDE的简单方法,因此我不可能使用EncryptByCert或EncryptByKey。我做得很好,因为文档显示上限为8000,这对于我们正在保存的数据来说已经足够了 碰巧的是,当我试图保存任何东西时,它的上限约为200个字符,生成一个514字节长的varbinary。514字节长度的varbinary可以很好地进行加密和解密,但不会增长或缩短,单个字符的计数与200个字符串的计数相同,使这些514字节
有人知道这是怎么回事吗?这些方法执行的加密是分块执行的,最大分块大小是密钥长度减去一些内部开销,1024位密钥为117字节,SQL Server 2016首次引入2048位密钥为245字节 如果您的输入大于此值,则必须将其拆分为块,并一次加密一个,然后连接结果 当然,应该相应地执行解密。然而,两者之间的一个重要区别是加密块大小将小于密钥,而对于解密,它应该正好是密钥大小。这是因为,任何数据,无论多么短,都将被加密到长密钥块中,这样就不会通过查看输出来猜测输入长度 以下是我为2012版编写的加密函数的摘录,因此假定为1024位密钥:
create function [dbo].[security_EncryptByCert]
(
@ClearText varbinary(max)
)
returns varbinary(max) with schemabinding, returns null on null input as begin
-- Returned value
declare @Ret varbinary(max) = 0x,
-- Length of the ciphertext
@Lng int = datalength(@ClearText),
-- Starting offset of the chunk to encrypt
@i int = 1,
-- Chunk size, currently it can't be more than 117 bytes
@Size int = 100,
-- Certificate to encrypt data with
@CertId int;
-- Determine the certificate with which to perform encryption
select @CertId = Id from ...
-- Iterate chunk by chunk til the end of the text
while @i < @Lng begin
set @Ret += encryptbycert(@CertId, substring(@ClearText, @i, @Size));
-- Move the pointer to the next block
set @i += @Size;
end;
return @Ret;
end;
在本例中,我使用了100字节的块,而不是最大的块。我真的不记得为什么了,但你可以在2016年使用245字节作为限制。您好,那么您建议我加密3000到5000个字符长的nvarchar字段吗?@JoséAlejandroCastelánIbarra,我提供的函数-或基于它的函数。