使用函数 DECRYPTBYPASSPHRASE 时,如何知道 SQL Server 使用什么哈希算法来解密加密数据?

Ron*_*ldo 13 sql-server encryption

我的问题与以下两个实例的实验有关:

SQL Server 2017 Express 实例 (Microsoft SQL Server 2017 (RTM-CU16))
SQL Server 2014 Express 实例 (Microsoft SQL Server 2014 (SP2-CU18))

我使用函数ENCRYPTBYPASSPHRASE来加密文本并将结果用作 DECRYPTBYPASSPHRASE 的@ciphertext。我的测试结果如下:

结果表

根据这个微软修复

[...] SQL Server 2017 使用 SHA2 散列算法来散列密码。SQL Server 2016 和更早版本的 SQL Server 使用不再被视为安全的 SHA1 算法。

但是,如果函数 DECRYPTBYPASSPHRASE 上没有与此相关的参数,它如何知道用于加密数据的算法是什么?它是加密数据的一部分吗?

根据我的测试结果,我猜 SQL Server 总是使用实例上可用的较新版本的算法来加密数据,但会尝试所有算法来解密数据,直到找到适合的算法或在找不到相应算法时返回 NULL . 这只是一个猜测,因为我找不到任何方法来检查 SQL Server 用于解密加密数据的散列算法。

Sea*_*ser 15

但是,如果函数 DECRYPTBYPASSPHRASE 上没有与此相关的参数,它如何知道用于加密数据的算法是什么?它是加密数据的一部分吗?

是的,恰到好处。

我将使用以下输出:

DECLARE @Data VARBINARY(MAX)
DECLARE @Text NVARCHAR(MAX) = N'I''ll get you, and your little dog too!'
DECLARE @Phrase NVARCHAR(100) = N'Fly My Pretties!'

SELECT @Data = ENCRYPTBYPASSPHRASE(@Phrase, @Text)

SELECT @Data AS [Encrypted_Data]

SELECT CAST(DECRYPTBYPASSPHRASE(@Phrase, @Data) AS NVARCHAR(MAX))
Run Code Online (Sandbox Code Playgroud)

如果我在 2014 年的实例上运行它,我将获得 Encrypted_Data 的以下信息: 0x01000000E565142762F62...

如果我在 2017 年的实例上运行它,我将获得 Encrypted_Data 的以下信息: 0x020000004D261C666204F...

应该弹出的是序言,您可以在其中看到 20140x01年的实例以0x02. 这是使用的加密类型的版本控制。请注意,不仅如此,但出于此答案的目的,无需深入了解该细节,也无需成为公众知识。

SQL Server 2017 了解0x01并且0x02因为它是新的并且了解新事物。SQL Server 2014 理解只是0x01因为它更旧,并且不知道任何新事物,因为新事物没有向后移植。

[...] SQL Server 2017 使用 SHA2 散列算法来散列密码。SQL Server 2016 和更早版本的 SQL Server 使用不再被视为安全的 SHA1 算法。

这不是一回事,但通常与在两个版本中使用相同初始化向量创建的对称密钥有关。我在 2017 年发布时写了一篇关于这个的博客,稍后用必须使用的跟踪标志修复了它,而在您的问题中,2017 年不需要跟踪标志来读取 2014 年的数据,如图所示。