使用函数DECRYPTBYPASSPHRASE时,我怎么知道SQL Server用来解密加密数据的哈希算法?


12

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

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

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

结果表

根据此Microsoft修复程序

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

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

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

Answers:


14

但是,如果在函数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))

如果我在2014年实例上运行此代码,则会获得Encrypted_Data的以下信息: 0x01000000E565142762F62...

如果我在2017年实例上运行此代码,则会获得Encrypted_Data的以下内容: 0x020000004D261C666204F...

应该弹出的是序言,您可以看到2014实例以开头,0x01而2017实例以开头0x02。这是所使用的加密类型的版本控制。请注意,不仅限于此,但就此答案的目的而言,无需赘述,也无需成为公众知识。

SQL Server 2017理解0x01并且0x02因为它是新的并且了解新事物。SQL Server 2014 0x01之所以能理解,是因为它较旧,并且不了解任何新事物,因为这些新事物并未被反向移植。

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

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


嗨,肖恩。您能否从您的答案中提供有关跟踪标志的更多详细信息?
康斯坦丁·
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.