Always Encrypted 암호화
적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance
이 문서에서는 SQL Server 및 Azure SQL 데이터베이스의 Always Encrypted 기능에 사용되는 암호화 자료를 파생하기 위한 암호화 알고리즘 및 메커니즘에 대해 설명합니다.
키, 키 저장소 및 키 암호화 알고리즘
상시 암호화는 열 마스터 키 및 열 암호화 키의 두 가지 키 유형을 사용합니다.
CMK(열 마스터 키)는 항상 클라이언트가 관리하고 외부 키 저장소에 저장되는 키 암호화 키(예: 다른 키를 암호화하기 위해 사용되는 키)입니다. 상시 암호화 활성화 클라이언트 드라이버는 CMK 저장소 공급자를 통해 키 저장소와 상호작용하고 드라이버 라이브러리(Microsoft/시스템 공급자)의 일부 또는 클라이언트 애플리케이션(사용자 지정 공급자)의 일부가 될 수 있습니다. 클라이언트 드라이버 라이브러리에는 현재 Windows 인증서 저장소 및 HSM(하드웨어 보안 모듈)용 Microsoft 키 저장소 공급자가 포함됩니다. 공급자의 현재 목록은 CREATE COLUMN MASTER KEY(Transact-SQL)를 참조하세요. 애플리케이션 개발자는 임의의 저장소에 대한 사용자 지정 공급자를 제공할 수 있습니다.
열 암호화 키(CEK)는 CMK로 보호되는 콘텐츠 암호화 키(예: 데이터를 보호하기 위해 사용되는 키)입니다.
모든 Microsoft CMK 저장소 공급자는 RSA-OAEP(최적 비대칭 암호화 패딩)와 함께 RSA를 사용하여 CEK를 암호화합니다. Microsoft Cryptography API를 지원하는 키 저장소 공급자입니다. Next Generation)를 .NET Framework(SqlColumnEncryptionCngProvider 클래스)에서 지원하는 키 저장소 공급자는 RFC 8017의 섹션 A.2.1에 지정된 기본 매개 변수를 사용합니다. 이러한 기본 매개 변수는 SHA-1의 해시 함수와 SHA-1이 포함된 MGF1의 마스크 생성 함수를 사용합니다. 다른 모든 키 저장소 공급자는 SHA-256을 사용합니다.
Always Encrypted는 내부적으로 FIPS 140-2 유효성이 검사된 암호화 모듈을 사용합니다.
데이터 암호화 알고리즘
상시 암호화는 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 cryptographically 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)
IV에 필요한 경우 데이터 1블록에 맞추기 위해 HMAC 값 잘림이 수행됩니다. 결과적으로 결정적 암호화는 항상 지정된 일반 텍스트 값에 대해 동일한 비밀번호 텍스트를 생성하므로 해당 비밀번호 텍스트 값을 비교하여 두 일반 텍스트 값이 같은지 여부를 유추할 수 있습니다. 이러한 제한된 정보 공개를 통해 데이터베이스 시스템은 암호화 열 값에서 동등 비교를 지원할 수 있습니다.
다른 방식과 비교했을 때 결정적 암호화는 미리 정의된 IV 값을 사용하는 것과 같이 패턴 숨기기에서 더 효과적입니다.
2단계: AES_256_CBC Ciphertext 컴퓨팅
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 |
날짜/시간 | 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.cs 및 SqlColumnEncryptionCertificateStoreProvider.cs 파일을 참조하세요.