首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以通过明文类型确定ENCRYPTBYKEY最大返回值?

是否可以通过明文类型确定ENCRYPTBYKEY最大返回值?
EN

Stack Overflow用户
提问于 2018-03-19 12:38:07
回答 2查看 1.2K关注 0票数 6

我将加密现有表中的几个字段。基本上,将使用以下加密技术:

代码语言:javascript
复制
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类型长度?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-19 13:29:31

您可以看到完整的规范这里

所以让我们计算一下:

  • 16字节密钥UID
  • _4字节头
  • 16字节IV (用于AES,16字节分组密码)

再加上加密消息的大小:

  • _4字节幻数
  • _2字节完整性字节长度
  • _0字节完整性字节(警告:可能被错误地放置在表中)
  • _2字节(明文)消息长度
  • _m字节(明文)消息
  • CBC填充字节

CBC填充字节的计算方法如下:

代码语言:javascript
复制
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是消息输入。

备注:

  • 请注意,报头中的第一个字节包含方案的版本号;如果使用不同的内部消息格式或加密方案,此答案没有也不能指定将添加或删除多少字节;
  • 强烈建议使用完整性字节,以防您想要保护您的DB字段不受更改(将帐户中的金额保密比确保金额不能更改更重要)。
  • 页面上的示例假定文本字符的单字节编码。
票数 6
EN

Stack Overflow用户

发布于 2019-09-01 18:16:08

根据Server 2008中的一些测试,下面的公式似乎有效。请注意,@明文是VARCHAR():

代码语言:javascript
复制
52 + (16 * ( ((LEN(@ClearText) + 8)/ 16) ) )

这与Maarten的答案大致兼容,只不过我的测试显示DATALENGTH(myBinary)始终为52 + (z * 16)形式,其中z是一个整数。

代码语言:javascript
复制
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()”。

代码语言:javascript
复制
while($len = <>) { 
  print 52 + ( 16 * int( ($len+8) / 16 ) ),"\n";
}

您可能需要使用此公式来计算大小,然后添加16以允许异常。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49363186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档