私の質問は、2つのインスタンスを使用した次の実験に関連しています。
SQL Server 2017 Expressインスタンス(Microsoft SQL Server 2017(RTM-CU16))
SQL Server 2014 Expressインスタンス(Microsoft SQL Server 2014(SP2-CU18))
関数 [〜#〜] encryptbypassphrase [〜#〜] を使用してテキストを暗号化し、その結果を@ [〜#〜] decryptbypassphrase [〜#〜]の@ciphertextとして使用しました 。私のテストの結果はこれらでした:
これによると Microsoft fix 、
[...] SQL Server 2017は、SHA2ハッシュアルゴリズムを使用してパスフレーズをハッシュします。 SQL Server 2016およびそれ以前のバージョンのSQL Serverは、安全と見なされなくなったSHA1アルゴリズムを使用しています。
しかし、関数DECRYPTBYPASSPHRASEに関連する引数がない場合、データの暗号化に使用されたアルゴリズムはどのようにしてわかりますか?暗号化されたデータの一部ですか?
私のテストの結果から、SQL Serverは常に、インスタンスで使用可能な新しいバージョンのアルゴリズムを使用してデータを暗号化していると思いますが、対応するアルゴリズムが見つからない場合は、すべてのアルゴリズムを試して、適合するアルゴリズムまたはNULLを返すアルゴリズムを見つけます。 。暗号化されたデータを復号化するためにSQL Serverがどのハッシュアルゴリズムを使用したかを確認する方法が見つからなかったためです。
しかし、関数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データを読み取るために必要なトレースフラグはありません。