暗号化は通常、アクセス制御 (のみ) ではなく、暗号化階層を制御することによって制御されます。つまり、ユーザーは、復号化/暗号化キー(具体的には、キーを保護するパスワード)を知ることで、データを暗号化および復号化できます。すべての優れた暗号化スキームは、キー階層を使用します。典型的な単純な階層は次のとおりです。
- データは対称鍵で暗号化されます
- 対称鍵は証明書で暗号化されています
- 証明書に関連付けられた秘密鍵はパスワードで暗号化されます
- 許可されたユーザーは、データにアクセスするために秘密鍵の復号化パスワードを提供します
使用する証明書に明示的な許可/拒否/取り消しのアクセス許可を追加することもできます。GRANT 証明書のアクセス許可を参照してください。質問に戻ります。
SYMMETRIC KEY を使用して ENCRYPT/DECRYPT の機能にアクセスするアカウントを 1 つだけ制限するにはどうすればよいですか?
この機能は、対称キー自体ではなく、対称キーを暗号化する証明書に適用する必要があります。このレベルの間接化により、データにアクセスできる各ユーザーの証明書を作成し、各ユーザーに自分のアクセス パスワードだけを知ってもらうことができます。アクセスの取り消しは、他のユーザーのアクセスに影響を与えることなく、その特定のユーザーの証明書をドロップするのと同じくらい簡単です。新しいユーザーを追加することは、新しい証明書を追加し、この新しい証明書の暗号化をデータを暗号化する対称キーに追加することを意味します。つまり、データへのアクセスを事実上許可します。ユーザーがアクセス パスワードを共有するという代替手段は、社会的な理由により、実際には機能しません。
上記のアカウントと SYMMETRIC KEY を使用して挿入されているため、暗号化が必要な列を更新するためのトリガーを使用できますか?
理想的には、アプリケーション層は、挿入前にデータを明示的に暗号化するデータ操作用のストアド プロシージャを呼び出す必要があります。INSTEAD OF トリガーを使用して、貧弱な「透明な」ソリューションをロールバックできます。計算列は、復号化されたデータを公開できます。最初に復号化証明書を適切に開かなかったすべてのユーザー (セッション) には NULL が表示されます。
キーをローテーションして変更する必要があります
対称キー自体ではなく、対称キーを暗号化する証明書をローテーションします。対称鍵も定期的に変更する必要がありますが、ローテーションは行わないでください。単純に新しい対称鍵を追加し、それを新しいデータと古いデータの更新に使用して、ブルート フォースの範囲を制限し、誕生日攻撃の可能性を減らします。その正当な理由は、保管中のデータを再暗号化すると、法外にコストがかかることが多いからです。ほとんどの暗号化スキームは、データの暗号化に使用される実際の対称キーではなく、暗号化階層 (つまり、上記の証明書) の上位にキーをローテーションします。