この記事では、Always Encrypted 対応データベースからデータにアクセスするときに .NET Framework 4.6.2 クライアント アプリケーションが失敗する原因となる問題の解決策について説明します。
元の製品バージョン: SQL Server 2016、SQL Server 2017
元の KB 番号: 3204545
現象
Microsoft .NET Framework 4.6.2 に含まれる .NET Framework Data Provider for Microsoft SQL Server (Sqlclient) を使用するクライアント アプリケーションがあります。 このアプリケーションを使用して、Windows または Microsoft Azure SQL Database の Microsoft SQL Server 2016、SQL Server 2017 で実行されている Always Encrypted 対応データベースに接続します。
Always Encrypted 対応データベースからレコードを復号化しようとすると、次のエラーのような断続的なエラー メッセージが表示されます。
復号化に失敗しました。 暗号化された列暗号化キーの最後の 10 バイトは、7E-0B-E6-D3-39-CE-35-86-2F-AA です。最初の 10 バイトの暗号テキストは、01-C3-D7-39-33-2F-E6-44-C3-B1 です。指定された暗号テキストに無効な認証タグがあります。
この問題が発生した場合、 Always Encrypted 設定によって保護されている列に対するクエリでは、返されるレコードが少なすぎるなど、正しくない結果が表示されることがあります。 これにより、不適切な動作がトリガーされる可能性があります。 たとえば、クライアント アプリケーションは、不足している値を挿入したり、追加のエラーを作成したり、データベースにデータの不整合を引き起こしたりする他の更新プロセスを実行しようとします。
解決方法
この問題を解決するには、 Microsoft セキュリティ情報 MS16-155 からセキュリティ更新プログラムをインストールします。
回避策
重要
クライアント アプリケーションが Microsoft Azure アプリ Service の Web Apps を介してホストされている場合、クライアントは自動的に .NET Framework 4.6.2 を使用します。 そのため、「 Symptoms 」セクションに記載されている問題が発生する可能性があります。 このシナリオでは、この問題の修正プログラムがリリースされるまで、このセクションの方法 2 の回避策 ("列の暗号化を無効にする") のみを使用できます。
この問題を回避するには、必要に応じて次のガイドラインに従ってください。
.NET クライアントはまだバージョン 4.6.2 にアップグレードされていません
Symptoms セクションで説明されている環境では、この問題が解決されるまで.NET Framework 4.6.2 にアップグレードしないことをお勧めします。 この問題は、以前のバージョンのドライバーには影響しません。
.NET クライアントは既に 4.6.2 にアップグレードされています
以下のいずれかの方法を使用します。
方法 1: .NET Framework バージョンをロールバックする
システムのホスティング クライアント アプリケーションから .NET Framework 4.6.2 をアンインストールします。 これにより、アプリケーションでは、この問題が発生しない古いバージョンの NET Framework Data Provider for SQL Server が使用されます。 これを行うには、次の手順を実行します。
- コントロール パネルで、Programs 項目を開き、Programs と Features を選択します。
- インストールされている更新プログラムを選択し、Microsoft Windows KB3120737 の Update をアンインストールします。
Note
任意のバージョンの .NET Framework をアンインストールした後、.NET Framework に依存するアプリケーションをテストすることをお勧めします。 依存している .NET Framework のバージョンをアンインストールすると、これらのアプリケーションが正しく機能しない可能性があります。
方法 2: 列暗号化キーのキャッシュを無効にする
.NET Framework のインストールをロールバックできない場合は、列暗号化キー (CEK) のキャッシュを無効にします。 これを行うには、クライアント アプリケーションで SqlConnection.ColumnEncryptionKeyCacheTtl プロパティ を 0 に設定します。 たとえば、次のコードを実行して、C# アプリケーションで列の暗号化を無効にします。
System.Data.SqlClient.SqlConnection.ColumnEncryptionKeyCacheTtl = TimeSpan.Zero
いずれかの方法を使用した後、SSMS のクエリ ウィンドウから実行されるテーブル スキャン中にエラーが再び表示されていないことを確認します (SELECT * FROM <table with Always Encrypted>) は、接続文字列の Column Encryption Setting=Enabled を持つデータベース接続を介して実行されます。 この種のスキャンを実行すると、正しい暗号化が検証されます。
重要
検証スキャン中に Symptoms セクションに記載されている問題が発生したユーザーは、 sqlalwaysencrypted@microsoft.comにお問い合わせください。 サポート チームは、このバグの影響を受ける以前に暗号化されたすべての行を回復するのに役立ちます。 このバグは、永続的なデータ損失を引き起こしません。
関連情報
Always Encrypted 用の .NET Framework 4.6.2 クライアント ドライバーにより、個々の行の暗号化を解除する断続的なエラーが発生する