Always Encrypted による暗号Always Encrypted cryptography

適用対象:Applies to: はいSQL ServerSQL Server (サポートされているすべてのバージョン) yesSQL ServerSQL Server (all supported versions) はいAzure SQL データベースAzure SQL DatabaseYesAzure SQL データベースAzure SQL Database適用対象:Applies to: はいSQL ServerSQL Server (サポートされているすべてのバージョン) yesSQL ServerSQL Server (all supported versions) はいAzure SQL データベースAzure SQL DatabaseYesAzure SQL データベースAzure SQL Database

このドキュメントでは、 および において、 SQL ServerSQL Server Always Encrypted Azure SQL データベースAzure SQL Database機能で使用される暗号化マテリアルを派生させる暗号化アルゴリズムとメカニズムについて説明します。This document describes encryption algorithms and mechanisms to derive cryptographic material used in the Always Encrypted feature in SQL ServerSQL Server and Azure SQL データベースAzure SQL Database.

キー、キー ストア、およびキー暗号化アルゴリズムKeys, key stores, and key encryption algorithms

Always Encrypted では 2 種類のキーを使用します。列マスター キーと列暗号化キーです。Always Encrypted uses two types of keys: Column master keys and column encryption keys.

列マスター キー (CMK) は、常にクライアントによって制御され、外部キー ストアに格納されているキー暗号化キー (たとえば、他のキーの暗号化に使用されるキー) です。A column master key (CMK) is a key encrypting key (for example, a key that is used to encrypt other keys) that is always in a client's control, and is stored in an external key store. Always Encrypted が有効なクライアント ドライバーは CMK ストア プロバイダーを介してキー ストアと対話します。このプロバイダーはドライバー ライブラリの一部 ( MicrosoftMicrosoft/system プロバイダー) またはクライアント アプリケーションの一部 (カスタム プロバイダー) である場合があります。An Always Encrypted-enabled client driver interacts with the key store via a CMK store provider, which can be either part of the driver library (a MicrosoftMicrosoft/system provider) or part of the client application (a custom provider). 現在、クライアント ドライバー ライブラリには、 MicrosoftMicrosoft Windows 証明書ストア およびハードウェア セキュリティ モジュール (HSM) の キー ストア プロバイダーが含まれています。Client driver libraries currently include MicrosoftMicrosoft key store providers for Windows Certificate Store and hardware security modules (HSMs). 現在のプロバイダーの一覧については、「CREATE COLUMN MASTER KEY (Transact-SQL)」を参照してください。For the current list of providers, see CREATE COLUMN MASTER KEY (Transact-SQL). アプリケーション開発者は、任意のストアのカスタム プロバイダーを提供できます。An application developer can supply a custom provider for an arbitrary store.

列暗号化キー (CEK) は、CMK によって保護されているコンテンツ暗号化キー (たとえば、データを保護するために使用されるキー) です。A column encryption key (CEK), is a content encryption key (for example, a key that is used to protect data) that is protected by a CMK.

すべての MicrosoftMicrosoft CMK ストア プロバイダーでは、RSA-OAEP (RSA with Optimal Asymmetric Encryption Padding) を使用して CEK が暗号化されます。All MicrosoftMicrosoft CMK store providers encrypt CEKs by using RSA with Optimal Asymmetric Encryption Padding (RSA-OAEP). Microsoft Cryptography API がサポートされているキー ストア プロバイダー:.NET Framework の Next Generation (CNG) (SqlColumnEncryptionCngProvider クラス) では、RFC 8017 のセクション A.2.1 で指定されている既定のパラメーターが使用されます。The key store provider that supports Microsoft Cryptography API: Next Generation (CNG) in .NET Framework (SqlColumnEncryptionCngProvider Class) uses the default parameters specified by RFC 8017 in Section A.2.1. これらの既定パラメーターでは、SHA-1 のハッシュ関数と、SHA-1 による MGF1 のマスク生成関数が使用されます。Those default parameters are using a hash function of SHA-1 and a mask generation function of MGF1 with SHA-1. 他のすべてのキー ストア プロバイダーでは、SHA-256 が使用されます。All other key store providers use SHA-256.

Always Encrypted では内部的に、FIPS 140-2 検証済み暗号化モジュールが使用されます。Always Encrypted internally uses FIPS 140-2 validated cryptographic modules.

データ暗号化のアルゴリズムData Encryption Algorithm

Always Encrypted では AEAD_AES_256_CBC_HMAC_SHA_256 アルゴリズムを使用して、データベース内のデータを暗号化します。Always Encrypted uses the AEAD_AES_256_CBC_HMAC_SHA_256 algorithm to encrypt data in the database.

AEAD_AES_256_CBC_HMAC_SHA_256 は、https://tools.ietf.org/html/draft-mcgrew-aead-aes-cbc-hmac-sha2-05 の仕様ドラフトから派生しました。AEAD_AES_256_CBC_HMAC_SHA_256 is derived from the specification draft at https://tools.ietf.org/html/draft-mcgrew-aead-aes-cbc-hmac-sha2-05. このアルゴリズムでは、Encrypt-then-MAC 手法に従って、関連データで認証済み暗号化スキームを使用します。It uses an Authenticated Encryption scheme with Associated Data, following an Encrypt-then-MAC approach. つまり、プレーンテキストが最初に暗号化され、その結果として生成される暗号化テキストに基づいて MAC が生成されます。That is, the plaintext is first encrypted, and the MAC is produced based on the resulting ciphertext.

パターンを非表示にするために、 AEAD_AES_256_CBC_HMAC_SHA_256 では暗号化ブロック チェーン (CBC) という操作モードを使用します。この場合、初期値は初期化ベクター (IV) という名前のシステムに渡されます。In order to conceal patterns, AEAD_AES_256_CBC_HMAC_SHA_256 uses the Cipher Block Chaining (CBC) mode of operation, where an initial value is fed into the system named the initialization vector (IV). CBC モードの詳細な説明は、https://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf にあります。The full description of the CBC mode can be found at https://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf.

AEAD_AES_256_CBC_HMAC_SHA_256 は、以下の手順を使用して指定されたプレーンテキストの暗号化テキストの値を計算します。AEAD_AES_256_CBC_HMAC_SHA_256 computes a ciphertext value for a given plaintext value using the following steps.

手順 1:初期化ベクター (IV) の生成Step 1: Generating the initialization vector (IV)

Always Encrypted では、以下の 2 種類の AEAD_AES_256_CBC_HMAC_SHA_256 がサポートされています。Always Encrypted supports two variations of AEAD_AES_256_CBC_HMAC_SHA_256:

  • ランダム化Randomized

  • 決定的Deterministic

ランダムな暗号化の場合、IV はランダムに生成されます。For randomized encryption, the IV is randomly generated. その結果、同じプレーンテキストが暗号化されるたびに、別の暗号化テキストが生成され、情報の漏えいを防ぐことができます。As a result, each time the same plaintext is encrypted, a different ciphertext is generated, which prevents any information disclosure.

When using randomized encryption: IV = Generate cryptographicaly random 128bits  

決定論的暗号化がある場合、IV はランダムに生成されず、代わりに、以下のアルゴリズムを使用してプレーンテキスト値から派生されます。If there's deterministic encryption, the IV isn't randomly generated, but instead it's derived from the plaintext value using the following algorithm:

When using deterministic encryption: IV = HMAC-SHA-256( iv_key, cell_data ) truncated to 128 bits.  

iv_key は以下の方法で CEK から派生します。Where iv_key is derived from the CEK in the following way:

iv_key = HMAC-SHA-256(CEK, "Microsoft SQL Server cell IV key" + algorithm + CEK_length)  

IV で必要な場合、1 つのデータ ブロックに収まるように HMAC 値の切り捨てが行われます。The HMAC value truncation is performed to fit one block of data as needed for the IV. その結果、決定的な暗号化では常に指定されたプレーンテキスト値に対して同じ暗号化テキストが生成されます。これにより、2 つのプレーンテキスト値のそれぞれ対応する暗号化テキスト値を比較して、プレーンテキスト値が同じであるかどうかを推定できます。As a result, deterministic encryption always produces the same ciphertext for a given plaintext value, which enables inferring whether two plaintext values are equal by comparing their corresponding ciphertext values. この制限された情報の公開により、データベース システムは暗号化された列値の等価比較をサポートできます。This limited information disclosure allows the database system to support equality comparison on encrypted column values.

決定的な暗号化は、定義済みの IV 値を使用するなどして、パターンを非表示にする場合や代替との比較を行う場合により効果的です。Deterministic encryption is more effective in concealing patterns, compared to alternatives, such as using a pre-defined IV value.

手順 2:AES_256_CBC 暗号化テキストの計算Step 2: Computing AES_256_CBC Ciphertext

IV を計算した後、 AES_256_CBC 暗号化テキストが次のように生成されます。After computing the IV, the AES_256_CBC ciphertext is generated:

aes_256_cbc_ciphertext = AES-CBC-256(enc_key, IV, cell_data) with PKCS7 padding.  

この暗号化キー (enc_key) は次のように CEK から派生します。Where the encryption key (enc_key) is derived from the CEK as follows.

enc_key = HMAC-SHA-256(CEK, "Microsoft SQL Server cell encryption key" + algorithm + CEK_length )  

手順 3:MAC の計算Step 3: Computing MAC

その後、MAC は以下のアルゴリズムを使用して計算されます。Subsequently, the MAC is computed using the following algorithm:

MAC = HMAC-SHA-256(mac_key, versionbyte + IV + Ciphertext + versionbyte_length)  

各値の説明:Where:

versionbyte = 0x01 and versionbyte_length = 1
mac_key = HMAC-SHA-256(CEK, "Microsoft SQL Server cell MAC key" + algorithm + CEK_length)  

手順 4:連結Step 4: Concatenation

最後に、暗号化された値は、アルゴリズム バージョン バイト、MAC、IV および AES_256_CBC 暗号化テキストを連結して生成されます。Finally, the encrypted value is produced by concatenating the algorithm version byte, the MAC, the IV, and the AES_256_CBC ciphertext:

aead_aes_256_cbc_hmac_sha_256 = versionbyte + MAC + IV + aes_256_cbc_ciphertext  

暗号化テキストの長さCiphertext Length

AEAD_AES_256_CBC_HMAC_SHA_256 暗号化テキストの各コンポーネントの長さ (バイト単位) は次のとおりです。The lengths (in bytes) of particular components of AEAD_AES_256_CBC_HMAC_SHA_256 ciphertext are:

  • versionbyte: 1versionbyte: 1

  • MAC: 32MAC: 32

  • IV: 16IV: 16

  • aes_256_cbc_ciphertext: (FLOOR (DATALENGTH(cell_data)/ block_size) + 1)* block_sizeaes_256_cbc_ciphertext: (FLOOR (DATALENGTH(cell_data)/ block_size) + 1)* block_size, where:

    • block_size は 16 バイトです。block_size is 16 bytes

    • cell_data はプレーンテキスト値です。cell_data is a plaintext value

    したがって、aes_256_cbc_ciphertext の最小サイズは 1 ブロックは (16 バイト) になります。Therefore, the minimal size of aes_256_cbc_ciphertext is 1 block, which is 16 bytes.

指定されたプレーンテキスト値を暗号化した場合の暗号化テキストの長さは、以下の式を使用して計算できます。Thus, the length of ciphertext, resulting from encrypting a given plaintext values (cell_data), can be calculated using the following formula:

1 + 32 + 16 + (FLOOR(DATALENGTH(cell_data)/16) + 1) * 16  

次に例を示します。For example:

  • 4 バイト長の int プレーンテキスト値は、暗号化後に 65 バイト長のバイナリ値になります。A 4-byte long int plaintext value becomes a 65-byte long binary value after encryption.

  • 2,000 バイト長の nchar(1000) プレーンテキスト値は、暗号化後に 2,065 バイト長のバイナリ値になります。A 2,000-byte long nchar(1000) plaintext values becomes a 2,065-byte long binary value after encryption.

次の表には、データ型と各型の暗号化テキストの長さの完全な一覧が含まれています。The following table contains a complete list of data types and the length of ciphertext for each type.

データ型Data Type 暗号化テキストの長さ (バイト)Ciphertext Length [bytes]
bigintbigint 6565
[バイナリ]binary 状況に応じて異なります。Varies. 上の式を使用します。Use the formula above.
bitbit 6565
charchar 状況に応じて異なります。Varies. 上の式を使用します。Use the formula above.
datedate 6565
datetimedatetime 6565
datetime2datetime2 6565
datetimeoffsetdatetimeoffset 6565
decimaldecimal 8181
floatfloat 6565
geographygeography 該当なし (サポートされていません)N/A (not supported)
geometrygeometry 該当なし (サポートされていません)N/A (not supported)
hierarchyidhierarchyid 該当なし (サポートされていません)N/A (not supported)
imageimage 該当なし (サポートされていません)N/A (not supported)
intint 6565
moneymoney 6565
ncharnchar 状況に応じて異なります。Varies. 上の式を使用します。Use the formula above.
ntextntext 該当なし (サポートされていません)N/A (not supported)
numericnumeric 8181
nvarcharnvarchar 状況に応じて異なります。Varies. 上の式を使用します。Use the formula above.
realreal 6565
smalldatetimesmalldatetime 6565
smallintsmallint 6565
smallmoneysmallmoney 6565
sql_variantsql_variant 該当なし (サポートされていません)N/A (not supported)
sysnamesysname 該当なし (サポートされていません)N/A (not supported)
texttext 該当なし (サポートされていません)N/A (not supported)
timetime 6565
timestamptimestamp

(rowversion)(rowversion)
該当なし (サポートされていません)N/A (not supported)
tinyinttinyint 6565
uniqueidentifieruniqueidentifier 8181
varbinaryvarbinary 状況に応じて異なります。Varies. 上の式を使用します。Use the formula above.
varcharvarchar 状況に応じて異なります。Varies. 上の式を使用します。Use the formula above.
xmlxml 該当なし (サポートされていません)N/A (not supported)

.NET リファレンス.NET Reference

このドキュメントに記載されているアルゴリズムの詳細については、.NET リファレンスSqlAeadAes256CbcHmac256Algorithm.csSqlColumnEncryptionCertificateStoreProvider.csSqlColumnEncryptionCertificateStoreProvider.cs ファイルを参照してください。For details about the algorithms, discussed in this document, see the SqlAeadAes256CbcHmac256Algorithm.cs, SqlColumnEncryptionCertificateStoreProvider.cs, and SqlColumnEncryptionCertificateStoreProvider.cs files in the .NET Reference.

参照See Also