Jon*_*des 4 sql-server encryption sql-server-2014
我正在开始一个加密项目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) 长度为:
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(第三个输入参数)的值必须设置为1Authenticator对结果长度没有影响,只要它至少为 1。Authenticator将对结果长度产生影响,该影响与设置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)
| 归档时间: |
|
| 查看次数: |
3107 次 |
| 最近记录: |