다음을 통해 공유


Always Encrypted 암호화

적용 대상: SQL Server Azure SQL Database 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 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)  

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.csSqlColumnEncryptionCertificateStoreProvider.cs 파일을 참조하세요.

참고 항목