我正在开始一个加密项目,EncryptByPassPhrase()
主要使用VARCHAR
值。自然,加密值比原始值长。是否有一个公式可以用来计算创建新VARBINARY
字段需要多长时间,以便保留原始VARCHAR
字段的任何可能值?
例如,我检查的第一个字段的值最长为 37 个字符,加密后的值最长为 100 个字节;另一个值最多为 50 个字符,加密值最多为 124 个字节。但是,短至两个或三个字符的值可以加密为 76 个字节。如果我将新字段的大小设置为 75 + X 字节,我是否有空间存储长度为 X 或更短的任何可能文本值的加密版本?
就我的测试而言(使用 SQL Server Express 2014、SP1 和 SQL Server Developer 2012 SP2,均为 64-it),不使用身份验证器的返回值 (
VARBINARY
) 长度的公式为:是:
尝试以下操作:
回报:
而且,如果您将数据类型更改为
@ClearText
beNVARCHAR(4000)
,并再次运行它,它会返回:注意:公式看起来可以通过取消
8
s 来减少。但是,这将导致它无法正常工作,因为它是适合“桶”的数据长度的带状范围:因此,
(DATALENGTH(@ClearText) / 8)
公式的一部分强制忽略十进制值,而不是四舍五入。这是通过划分两个 INT 值的默认行为实现的;-)。更新:
上面完成的测试没有使用ENCRYPTBYPASSPHRASE可用的选项:指定“身份验证器”。这样做会在最小长度上增加 16 个字节,然后虽然增量仍以 8 字节为步长,并且虽然带状范围仍然是每个 8 个字节,但初始范围只有 4 个字节,因此范围偏移 4 为与不使用验证器时的范围边界相比。为了帮助说明,下图显示了范围及其相应的结果长度:
使用验证器时的公式返回值 (
VARBINARY
) 长度为:是:
笔记:
PassPhrase
对结果长度没有影响PassPhrase
结果长度没有影响Authenticator
值产生任何影响,Add_Authenticator
(第三个输入参数)的值必须设置为1
Authenticator
没有影响。Authenticator
将对结果长度产生影响,该影响与设置Add_Authenticator
为相同0
。Add_Authenticator
一设置为0
、 或Authenticator
为空字符串或NULL
,则公式与没有“身份验证器”相同。以下是一个扩展和改进的测试,显示有和没有“身份验证器”,并且更容易更改
@PassPhrase
值:这不科学;获得科学答案的唯一方法是查看 SQL Server 开发人员用于实现 3DES 128 算法的代码。
话虽如此,建立了一个快速测试装置,试图确定加密文本的实际长度。
这会生成长度在 1 到 4000 字节之间变化的密码和数据,然后将
ENCRYPTBYPASSPHRASE
函数的输出与输入数据的长度进行比较。我发现,在我的计算机上,输出中有 41 到 48 个“额外”字节。话虽如此,我建议将
VARBINARY(8000)
其用作字段大小,因为这是该函数定义的最大输出。在使用 enryptbypassphrase 加密后,我遇到了这个来确定 varbinary 数据的长度