상시 암호화되는 암호화Always Encrypted Cryptography

이 항목 적용 대상: 예SQL Server예Azure SQL 데이터베이스없습니다Azure SQL 데이터 웨어하우스 없습니다 병렬 데이터 웨어하우스THIS TOPIC APPLIES TO: yesSQL ServeryesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

이 문서에서는 SQL ServerSQL Server 상시 암호화 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 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. 상시 암호화 활성화 클라이언트 드라이버는 CMK 저장소 공급자를 통해 키 저장소와 상호작용하고 드라이버 라이브러리( MicrosoftMicrosoft/시스템 공급자)의 일부 또는 클라이언트 응용 프로그램(사용자 지정 공급자)의 일부가 될 수 있습니다.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 저장소 공급자는 RFC 3447 섹션 2.1항에 의해 지정된 기본 매개 변수가 있는 최적 비대칭 암호화 패딩(RSA-OAEP)와 RSA를 사용하여 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 3447 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

상시 암호화는 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_256http://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 http://tools.ietf.org/html/draft-mcgrew-aead-aes-cbc-hmac-sha2-05. 관련 데이터와 인증 암호화 체계를 사용하며 암호화 후 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 모드에 대한 모든 설명은 http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf를 참조하세요.The full description of the CBC mode can be found at http://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)

상시 암호화가 지원하는 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)  

필요한 경우 IV에서는 데이터 1블록에 맞추기 위해 HMAC 값 잘림이 수행됩니다.The HMAC value truncation is performed in order to fit 1 block of data as needed for the IV.
결과적으로, 결정적 암호화는 지정된 일반 텍스트 값에 대하여 동일한 암호 텍스트를 생성하여 상응하는 암호 텍스트 값을 비교함으로써 두 일반 텍스트 값이 동일한지 유추할 수 있습니다.As a result, deterministic encryption always produces the same ciphertext for a given plaintext values, 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 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:

  • 버전 바이트: 1versionbyte: 1

  • MAC: 32MAC: 32

  • IV: 16IV: 16

  • aes_256_cbc_ciphertext: (FLOOR (DATALENGTH(cell_data)/ block_size) + 1)* block_size, 여기에서:aes_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.

    따라서 지정된 일반 텍스트 값(cell_data)을 암호화하여 생성된 암호 텍스트 길이는 다음 수식을 사용하여 계산될 수 있습니다.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
binarybinary 다양함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.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 (Database Engine)
상시 암호화(클라이언트 개발)Always Encrypted (client development)