Sql server SQL Server encryptbycert封顶关闭

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字节

我的问题是,由于我工作场所的策略,我试图加密SQL Server数据库中的一列。我只能使用加密TDE的简单方法,因此我不可能使用EncryptByCert或EncryptByKey。我做得很好,因为文档显示上限为8000,这对于我们正在保存的数据来说已经足够了

碰巧的是,当我试图保存任何东西时,它的上限约为200个字符,生成一个514字节长的varbinary。514字节长度的varbinary可以很好地进行加密和解密,但不会增长或缩短,单个字符的计数与200个字符串的计数相同,使这些514字节成为二进制。在大约230个字符之后,我想要加密它,它只会将列保留为空


有人知道这是怎么回事吗?

这些方法执行的加密是分块执行的,最大分块大小是密钥长度减去一些内部开销,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,我提供的函数-或基于它的函数。