криптография Always Encrypted

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

В этой статье описываются алгоритмы шифрования и механизмы для получения криптографических материалов, используемых в функции Always Encrypted в SQL Server и База данных SQL Azure. Эти алгоритмы применяются ко всем редакциям и версиям Always Encrypted; как Always Encrypted с безопасными анклавами, так и без них используют один и тот же алгоритм шифрования.

Ключи, хранилища ключей и алгоритмы шифрования ключей

В Always Encrypted используются два типа ключей: главные ключи столбцов и ключи шифрования столбцов.

Главный ключ столбца (CMK) — это ключ шифрования ключей (например, ключ, который используется для шифрования других ключей), который всегда находится под контролем клиента и хранится во внешнем хранилище ключей. Драйвер клиента с поддержкой Always Encrypted взаимодействует с хранилищем ключей с помощью поставщика хранилища CMK, который может быть частью библиотеки драйверов (поставщик microsoft/system) или частью клиентского приложения (настраиваемый поставщик). В настоящее время библиотеки клиентских драйверов включают поставщиков хранилища ключей Майкрософт для хранилища сертификатов Windows и аппаратных модулей безопасности (HSM). Текущий список поставщиков см. в разделе CREATE COLUMN MASTER KEY (Transact-SQL). Разработчик приложения может указать пользовательский провайдер для произвольного хранилища.

Ключ шифрования столбца (CEK) — это ключ шифрования содержимого (например, ключ, используемый для защиты данных), защищённый главным ключом столбца (CMK).

Все поставщики хранилищ Microsoft CMK шифруют ключи CEK с помощью RSA с оптимальным асимметричным дополнением (RSA-OAEP). Поставщик хранилища ключей, поддерживающий API шифрования Майкрософт: следующее поколение (CNG) в платформа .NET Framework (класс SqlColumnEncryptionCngProvider) использует параметры по умолчанию, заданные RFC 8017 в разделе A.2.1. В этих параметрах по умолчанию используется хэш-функция SHA-1 и функция генерации маски MGF1 с помощью SHA-1. Все остальные поставщики хранилищ ключей используют SHA-256.

Always Encrypted внутренне использует проверенные криптографические модули FIPS 140-2.

Алгоритм шифрования данных

Функция Always Encrypted использует алгоритм AEAD_AES_256_CBC_HMAC_SHA_256 для шифрования данных в базе данных. AEAD означает аутентификацию шифрования с связанными данными; HMAC обозначает код проверки подлинности на основе хэша сообщений; MAC обозначает код проверки подлинности сообщений.

AEAD_AES_256_CBC_HMAC_SHA_256 происходит из черновика спецификации IETF. В ней используется схема аутентифицированного шифрования с дополнительными данными по схеме Encrypt-then-MAC. То есть открытый текст сначала шифруется, а затем MAC вычисляется на основе полученного шифртекста.

Чтобы скрыть закономерности, AEAD_AES_256_CBC_HMAC_SHA_256 использует режим сцепления блоков шифротекста (CBC), при котором в систему подаётся начальное значение, называемое вектором инициализации (IV). Полное описание режима CBC можно найти в Национальном институте стандартов и технологий США (NIST).

АлгоритмAEAD_AES_256_CBC_HMAC_SHA_256 вычисляет значение зашифрованного текста для заданного значения открытого текста с помощью следующих шагов.

Шаг 1. Создание вектора инициализации

Технология постоянного шифрования поддерживает два метода шифрования с помощью алгоритма 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)  

Чтобы привести один блок данных в соответствие с требованиями вектора инициализации, значение HMAC сокращается. Как результат, при выполнении детерминированного шифрования всегда создается один зашифрованный текст для значений открытого текста. Это позволяет определить одинаковые значения открытого текста, сравнив соответствующие значения зашифрованного текста. Это ограниченное раскрытие информации позволяет системе управления базой данных поддерживать сравнение на равенство значений в зашифрованном столбце.

Детерминированное шифрование эффективнее маскирует закономерности по сравнению с другими вариантами, например с использованием заранее заданного значения IV.

Шаг 2. Вычисление AES_256_CBC зашифрованного текста

Для алгоритма Always Encrypted AEAD_AES_256_CBC_HMAC_SHA_256 после вычисления IV на шаге 1 формируется шифротекст 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. Вычисление имитовставки

Для алгоритма AEAD_AES_256_CBC_HMAC_SHA_256 в Always Encrypted MAC (код проверки подлинности сообщения) вычисляется на основе байта версии, IV (из шага 1) и шифротекста AES_256_CBC (из шага 2) с использованием mac_key, производного от ключа шифрования столбца (CEK):

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. Объединение

Для алгоритма always Encrypted AEAD_AES_256_CBC_HMAC_SHA_256 окончательное зашифрованное значение создается путем объединения байтов версии алгоритма, MAC (из шага 3), IV (из шага 1) и AES_256_CBC шифра (с шага 2):

aead_aes_256_cbc_hmac_sha_256 = versionbyte + MAC + IV + aes_256_cbc_ciphertext  

Длина шифра

Длина (в байтах) конкретных компонентов зашифрованного текста AEAD_AES_256_CBC_HMAC_SHA_256 :

Компонент Размер (в байтах)
versionbyte 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 байт).

Длину зашифрованного текста после шифрования значений заданного открытого текста (cell_data) можно вычислить по следующей формуле:

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

Например:

  • После шифрования 4-байтовое значение открытого текста типа int станет длинным двоичным значением размером 65 байт.

  • Значение открытого текста типа nchar(1000) длиной 2,000 байт становится двоичным значением длиной 2,065 байт после шифрования.

Длина шифра зависит от типа исходных данных. Для типов фиксированной длины результат является константой; для типов переменной длины (char, , ncharvarcharnvarchar, , binary, ) varbinaryиспользуйте приведенную выше формулу. Типы, помеченные как N/A , не могут быть зашифрованы с помощью Always Encrypted. Следующая таблица содержит полный список типов данных и длину зашифрованного текста для каждого типа.

Тип данных Длина шифра [байты]
bigint 65
binary Возможны разные варианты. Рассчитывается по формуле выше.
bit 65
char Возможны разные варианты. Рассчитывается по формуле выше.
дата 65
datetime 65
datetime2 65
datetimeoffset 65
десятичное 81
float 65
geography Не поддерживается.
geometry Не поддерживается.
hierarchyid Не поддерживается.
Изображение Не поддерживается.
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 N/A (не поддерживается)

справочник по .NET

Дополнительные сведения об алгоритмах, рассмотренных в этой статье, см. в SqlAeadAes256CbcHmac256Algorithm.cs,SqlColumnEncryptionCertificateStoreProvider.cs и SqlColumnEncryptionCngProvider.cs файлах в справочнике по .NET.