我将加密现有表中的几个字段。基本上,将使用以下加密技术:
CREATE MASTER KEY ENCRYPTION
BY PASSWORD = 'sm_long_password@'
GO
CREATE CERTIFICATE CERT_01
WITH SUBJECT = 'CERT_01'
GO
CREATE SYMMETRIC KEY SK_01
WITH ALGORITHM = AES_256 ENCRYPTION
BY CERTIFICATE CERT_01
GO
OPEN SYMMETRIC KEY SK_01 DECRYPTION
BY CERTIFICATE CERT_01
SELECT ENCRYPTBYKEY(KEY_GUID('SK_01'), 'test')
CLOSE SYMMETRIC KEY SK_01
DROP SYMMETRIC KEY SK_01
DROP CERTIFICATE CERT_01
DROP MASTER KEY恩克返回最大大小为8,000字节的varbinary。知道表字段将被加密(例如:nvarchar(128)、varchar(31)、bigint),我如何定义新的varbinary类型长度?
发布于 2018-03-19 13:29:31
您可以看到完整的规范这里。
所以让我们计算一下:
16字节密钥UID_4字节头16字节IV (用于AES,16字节分组密码)再加上加密消息的大小:
_4字节幻数_2字节完整性字节长度_0字节完整性字节(警告:可能被错误地放置在表中)_2字节(明文)消息长度_m字节(明文)消息CBC填充字节的计算方法如下:
16 - ((m + 4 + 2 + 2) % 16)因为填充物总是被应用。这将导致范围1.16中的许多填充字节。一个鬼鬼祟祟的快捷方式就是在总数中添加16个字节,但这可能意味着您要指定最多15个从未使用过的字节。
我们可以将其缩短为36 + 8 + m + 16 - ((m + 8) % 16)或60 + m - ((m + 8) % 16。或者,如果您使用上面指定的小技巧,而不关心浪费的字节:76 + m,其中m是消息输入。
备注:
发布于 2019-09-01 18:16:08
根据Server 2008中的一些测试,下面的公式似乎有效。请注意,@明文是VARCHAR():
52 + (16 * ( ((LEN(@ClearText) + 8)/ 16) ) )这与Maarten的答案大致兼容,只不过我的测试显示DATALENGTH(myBinary)始终为52 + (z * 16)形式,其中z是一个整数。
LEN(myVarCharString) DATALENGTH(encryptedString)
-------------------- -----------------------------------------
0 through 7 usually 52, but occasionally 68 or 84
8 through 23 usually 68, but occasionally 84
24 through 39 usually 84
40 through 50 100"myVarCharString“是定义为VARCHAR(50)的表列。该表载有15万份记录。提到“偶尔”的例子是大约十分之一的记录会被撞到一个更高的桶里;非常奇怪。对于24岁及更高的LEN(),没有足够的记录来获得奇怪的异常。
下面是一些Perl代码,它将"myVarCharString“的建议长度作为终端的输入,并为EncryptByKey()结果生成预期大小。函数"int()“等效于"Math.floor()”。
while($len = <>) {
print 52 + ( 16 * int( ($len+8) / 16 ) ),"\n";
}您可能需要使用此公式来计算大小,然后添加16以允许异常。
https://stackoverflow.com/questions/49363186
复制相似问题