Always Encrypted 암호화

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

이 문서에서는 SQL Server 및 Azure SQL Database의 Always Encrypted 기능에 사용되는 암호화 자료를 파생하기 위한 암호화 알고리즘 및 메커니즘에 대해 설명합니다.

키, 키 저장소 및 키 암호화 알고리즘

상시 암호화는 열 마스터 키 및 열 암호화 키의 두 가지 키 유형을 사용합니다.

CMK(열 마스터 키)는 항상 클라이언트의 컨트롤에 있고 외부 키 저장소에 저장되는 키 암호화 키(예: 다른 키를 암호화하는 데 사용되는 키)입니다. Always Encrypted 사용 클라이언트 드라이버는 CMK 저장소 공급자를 통해 키 저장소와 상호 작용합니다. 이 공급자는 드라이버 라이브러리(Microsoft/시스템 공급자) 또는 클라이언트 애플리케이션(사용자 지정 공급자)의 일부일 수 있습니다. 클라이언트 드라이버 라이브러리에는 현재 Windows 인증서 저장소 및 HSM(하드웨어 보안 모듈)용 Microsoft 키 저장소 공급자가 포함됩니다. 현재 공급자 목록은 CREATE COLUMN MASTER KEY(Transact-SQL)를 참조하세요. 애플리케이션 개발자는 임의의 저장소에 대한 사용자 지정 공급자를 제공할 수 있습니다.

CEK(열 암호화 키)는 CMK로 보호되는 콘텐츠 암호화 키(예: 데이터를 보호하는 데 사용되는 키)입니다.

모든 Microsoft CMK 저장소 공급자는 RSA-OAEP(최적 비대칭 암호화 패딩)와 함께 RSA를 사용하여 CEK를 암호화합니다. .NET Framework(SqlColumnEncryptionCngProvider 클래스)에서 Microsoft Cryptography API: Next Generation(CNG)을 지원하는 키 저장소 공급자는 섹션 A.2.1의 RFC 8017에 지정된 기본 매개 변수를 사용합니다. 이러한 기본 매개 변수는 SHA-1의 해시 함수와 SHA-1과 함께 MGF1의 마스크 생성 함수를 사용합니다. 다른 모든 키 저장소 공급자는 SHA-256을 사용합니다.

Always Encrypted는 내부적으로 FIPS 140-2 유효성이 검사된 암호화 모듈을 사용합니다.

데이터 암호화 알고리즘

Always Encrypted는 AEAD_AES_256_CBC_HMAC_SHA_256 알고리즘을 사용하여 데이터베이스의 데이터를 암호화합니다.

AEAD_AES_256_CBC_HMAC_SHA_256 .의 사양 초안https://tools.ietf.org/html/draft-mcgrew-aead-aes-cbc-hmac-sha2-05에서 파생됩니다. 관련 데이터와 인증 암호화 체계를 사용하며 암호화 후 MAC 방식을 따릅니다. 즉, 일반 텍스트는 먼저 암호화되고 MAC은 결과 암호 텍스트에 따라 생성됩니다.

패턴을 숨기기 위해 AEAD_AES_256_CBC_HMAC_SHA_256 초기 값이 IV(초기화 벡터)라는 시스템에 공급되는 CBC(암호 블록 체인) 작업 모드를 사용합니다. CBC 모드에 대한 자세한 설명은 https://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf에 있습니다.

AEAD_AES_256_CBC_HMAC_SHA_256 은 다음 단계를 통해 지정된 일반 텍스트 값에 대한 암호화 값을 계산합니다.

1단계: IV(초기화 벡터) 생성

Always Encrypted는 두 가지 AEAD_AES_256_CBC_HMAC_SHA_256 변형을 지원합니다.

  • 임의

  • 명확함

임의 암호화의 경우 IV가 임의로 생성됩니다. 따라서 동일한 일반 텍스트가 암호화될 때마다 다른 암호 텍스트가 생성되어 정보 공개를 방지합니다.

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

결정적 암호화가 있는 경우 IV는 임의로 생성되지 않고 대신 다음 알고리즘을 사용하여 일반 텍스트 값에서 파생됩니다.

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

여기서 iv_key 다음과 같은 방법으로 CEK에서 파생됩니다.

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

HMAC 값 잘림은 IV에 필요한 한 블록의 데이터에 맞게 수행됩니다. 결과적으로 결정적 암호화는 항상 지정된 일반 텍스트 값에 대해 동일한 암호 텍스트를 생성하므로 해당 암호 텍스트 값을 비교하여 두 일반 텍스트 값이 같은지 여부를 유추할 수 있습니다. 이러한 제한된 정보 공개를 통해 데이터베이스 시스템은 암호화 열 값에서 동등 비교를 지원할 수 있습니다.

다른 방식과 비교했을 때 결정적 암호화는 미리 정의된 IV 값을 사용하는 것과 같이 패턴 숨기기에서 더 효과적입니다.

2단계: 암호화 AES_256_CBC 컴퓨팅

IV 를 컴퓨팅한 후 AES_256_CBC 암호 텍스트가 생성됩니다.

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

여기서 암호화 키(enc_key)는 다음과 같이 CEK에서 파생됩니다.

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

3단계: MAC 컴퓨팅

그 후 MAC은 다음 알고리즘을 사용하여 계산됩니다.

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

여기서

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

4단계: 연결

마지막으로, 암호화된 값은 알고리즘 버전 바이트, MAC, IV 및 AES_256_CBC 암호 텍스트를 연결하여 생성됩니다.

aead_aes_256_cbc_hmac_sha_256 = versionbyte + MAC + IV + aes_256_cbc_ciphertext  

암호 텍스트 길이

AEAD_AES_256_CBC_HMAC_SHA_256 암호 텍스트의 특정 구성 요소의 길이(바이트)는 다음과 같습니다.

  • 버전 바이트: 1

  • MAC: 32

  • IV: 16

  • aes_256_cbc_ciphertext: (FLOOR (DATALENGTH(cell_data)/ block_size) + 1)* block_size, 위치:

    • block_size 16바이트입니다.

    • cell_data 일반 텍스트 값입니다.

    따라서 aes_256_cbc_ciphertext 최소 크기는 16바이트인 1블록입니다.

따라서 지정된 일반 텍스트 값(cell_data)을 암호화한 결과로 발생하는 암호 텍스트의 길이는 다음 수식을 사용하여 계산할 수 있습니다.

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

예:

  • 4바이트의 긴 int 일반 텍스트 값은 암호화 후 65바이트의 긴 이진 값이 됩니다.

  • 2,000바이트의 긴 nchar(1000) 일반 텍스트 값은 암호화 후 2,065바이트의 긴 이진 값이 됩니다.

다음 표는 전체 데이터 유형 목록 및 각 유형의 암호화 텍스트 길이를 보여줍니다.

데이터 유형 암호 텍스트 길이 [바이트]
bigint 65
binary 다릅니다. 위의 수식을 사용합니다.
bit 65
char 다릅니다. 위의 수식을 사용합니다.
date 65
datetime 65
datetime2 65
datetimeoffset 65
decimal 81
float 65
geography 해당 없음(지원되지 않음)
geometry 해당 없음(지원되지 않음)
hierarchyid 해당 없음(지원되지 않음)
image 해당 없음(지원되지 않음)
int 65
money 65
nchar 다릅니다. 위의 수식을 사용합니다.
ntext 해당 없음(지원되지 않음)
numeric 81
nvarchar 다릅니다. 위의 수식을 사용합니다.
real 65
smalldatetime 65
smallint 65
smallmoney 65
sql_variant 해당 없음(지원되지 않음)
sysname 해당 없음(지원되지 않음)
text 해당 없음(지원되지 않음)
time 65
timestamp

(rowversion)
해당 없음(지원되지 않음)
tinyint 65
uniqueidentifier 81
varbinary 다릅니다. 위의 수식을 사용합니다.
varchar 다릅니다. 위의 수식을 사용합니다.
xml 해당 없음(지원되지 않음)

.NET 참조

이 문서에서 설명하는 알고리즘에 대한 자세한 내용은 .NET 참조의 SqlAeadAes256CbcHmac256Algorithm.cs, SqlColumnEncryptionCertificateStoreProvider.csSqlColumnEncryptionCertificateStoreProvider.cs 파일을 참조하세요.

참고 항목