Always Encrypted による暗号化Always Encrypted Cryptography

適用対象: ○SQL Server ○Azure SQL Database XAzure SQL Data Warehouse XParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

このドキュメントでは、 および において、 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 (i.e. a key used to encrypt other keys) that is always in 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). 現在、クライアント ドライバー ライブラリには、Windows 証明書ストアおよびハードウェア セキュリティ モジュール (HSM) の MicrosoftMicrosoft キー ストア プロバイダーが含まれています。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 (i.e. a key used to protect data) that is protected by a CMK.

すべての MicrosoftMicrosoft CMK ストア プロバイダーは、セクション A.2.1 の RFC 8017 で指定されている既定のパラメーターを指定し、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) with 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.

データ暗号化のアルゴリズム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 はランダムに生成されませんが、その代わりに、以下のアルゴリズムを使用してプレーンテキスト値から派生します。In the case of deterministic encryption, the IV is not randomly generated, but instead it is 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)  

HMAC 値の切り捨ては、IV での必要に応じて 1 つのデータ ブロックに収まるように実行されます。The HMAC value truncation is performed in order to fit 1 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:ConcatenationStep 4: Concatenation

最後に、暗号化された値は、アルゴリズム バージョン バイト、MAC、IV および AES_256_CBC 暗号化テキストを単に連結して生成されます。Finally, the encrypted value is produced by simply 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.cs ファイルと SqlColumnEncryptionCertificateStoreProvider.csファイルを参照してください。For details about the algorithms, discussed in this document, see the SqlAeadAes256CbcHmac256Algorithm.cs and SqlColumnEncryptionCertificateStoreProvider.cs files in the .NET Reference.

参照See Also

Always Encrypted (データベース エンジン) Always Encrypted (Database Engine)
Always Encrypted (クライアント開発)Always Encrypted (client development)