EncryptByPassPhrase() 的输出相对于输入有多长?

Jon*_*des 4 sql-server encryption sql-server-2014

我正在开始一个加密项目EncryptByPassPhrase(),主要使用VARCHAR值。自然地,加密值比原始值长。是否有一个公式可以用来计算创建新VARBINARY字段需要多长时间,以便保留原始VARCHAR字段的任何可能值?

例如,我检查的第一个字段的长度值最多为 37 个字符,加密值最多为 100 个字节;另一个值最多 50 个字符,加密值最多 124 个字节。但是,短至两个或三个字符的值可以加密到 76 个字节。如果我将新字段的大小设置为 75 + X 字节,我是否有空间存储长度为 X 或更短的任何可能文本值的加密版本?

Sol*_*zky 7

就我的测试而言(使用 SQL Server Express 2014 SP1 和 SQL Server Developer 2012 SP2,均为 64-it),使用身份验证器的公式返回值 ( VARBINARY) 长度为:

ENCRYPTBYPASSPHRASE('_My_PassPhr@zE_yo_', {anything})
Run Code Online (Sandbox Code Playgroud)

是:

28 + (8 * (DATALENGTH(@ClearText) / 8))
Run Code Online (Sandbox Code Playgroud)

请尝试以下操作:

DECLARE @ClearText VARCHAR(8000);
SET @ClearText = 'testdfdf gkdj flkgjdlfkgjdlf gjlf gklf TE%$%^&^%HFGHFhg fkgh jfgkhæ';

SELECT LEN(ENCRYPTBYPASSPHRASE('_My_PassPhr@zE_yo_', @ClearText)) AS [ActualLength],
       28 + (8 * (DATALENGTH(@ClearText) / 8)) AS [EstimatedLength];
Run Code Online (Sandbox Code Playgroud)

返回:

ActualLength    EstimatedLength
92              92
Run Code Online (Sandbox Code Playgroud)

并且,如果您将 的数据类型更改为@ClearTextbe NVARCHAR(4000),然后再次运行它,它会返回:

ActualLength    EstimatedLength
156             156
Run Code Online (Sandbox Code Playgroud)

注意:公式看起来可以通过取消8s来减少。但是,这将导致它无法正常工作,因为它是适合“存储桶”的数据长度的带状范围:

input bytes    result length
-----------    -------------
 1 -  7        28
 8 - 15        36
16 - 23        44
24 - 31        52
Run Code Online (Sandbox Code Playgroud)

因此,(DATALENGTH(@ClearText) / 8)公式的一部分强制执行忽略十进制值而不是四舍五入的值。这是通过将两个 INT 值相除的默认行为来实现的;-)。


更新:

上面完成的测试不使用ENCRYPTBYPASSPHRASE可用的选项:指定“身份验证器”。这样做会在最小长度上增加 16 个字节,然后当增量仍然以 8 字节为步长时,虽然带区范围仍然是每个 8 个字节,但初始范围仅为 4 个字节,因此范围偏移了 4 为与不使用身份验证器时的范围边界相比。为了帮助说明,下图显示了范围及其相应的结果长度:

input bytes    result length
-----------    -------------
 0 -  3        44
 4 - 11        52
12 - 19        60
20 - 27        68
Run Code Online (Sandbox Code Playgroud)

使用身份验证器返回值 ( VARBINARY) 长度的公式:

ENCRYPTBYPASSPHRASE('_My_PassPhr@zE_yo_', {anything}, 1, {anything_1-128_bytes})
Run Code Online (Sandbox Code Playgroud)

是:

44 + (8 * ((DATALENGTH(@ClearText) + 4) / 8))
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 的长度PassPhrase对结果长度没有影响
  • 空字符串对PassPhrase结果长度没有影响
  • 为了使某个Authenticator值产生任何效果,Add_Authenticator(第三个输入参数)的值必须设置为1
  • 的长度Authenticator对结果长度没有影响,只要它至少为 1
  • 空字符串 forAuthenticator将对结果长度产生影响,该影响与设置Add_Authenticator为相同0
  • 如果任一Add_Authenticator设置为0,或者Authenticator是空字符串或NULL,则公式与没有“身份验证器”一样。

以下是一个扩展和改进的测试,显示了有和没有“身份验证器”的情况,并使更改@PassPhrase值更容易:

DECLARE @ClearText NVARCHAR(4000),
        @Authenticator sysname,
        @PassPhrase VARCHAR(100);

SET @PassPhrase = '_My_PassPhr@zE_yo_';
SET @ClearText = 'testdfdf gkdj flkgjdlfkgjdlf gjlf gklf TE%$%^&^%HFGHFhg fkgh jfgkhæ';
SET @Authenticator = REPLICATE(N' ', 128);

SELECT LEN(ENCRYPTBYPASSPHRASE(@PassPhrase, @ClearText))
                                         AS [ActualLengthSansAuthenticator],
       28 + (8 * (DATALENGTH(@ClearText) / 8)) AS [EstimatedLengthSansAuthenticator];

SELECT LEN(ENCRYPTBYPASSPHRASE(@PassPhrase, @ClearText, 1, @Authenticator))
                                         AS [ActualLengthWithAuthenticator],
       44 + (8 * ((DATALENGTH(@ClearText) + 4) / 8)) AS [EstimatedLengthWithAuthenticator];
Run Code Online (Sandbox Code Playgroud)