Шифрование Always Encrypted

Применяется к:SQL ServerAzure SQL DatabaseAzure, управляемому экземпляру SQL Azure

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

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

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

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

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

Все поставщики хранилища MICROSOFT CMK шифруют пакеты CE С помощью 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.

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

Для шифрования данных в базе данных в технологии постоянного шифрования данных используется алгоритм 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.

Чтобы скрыть шаблоны, в алгоритме AEAD_AES_256_CBC_HMAC_SHA_256 используется метод применения блочного шифра, в котором исходные значения шифруются с использованием вектора инициализации (IV). Полное описание режима CBC можно найти по адресу https://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf.

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

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

Технология постоянного шифрования поддерживает два метода шифрования с помощью алгоритма AEAD_AES_256_CBC_HMAC_SHA_256:

  • Случайное

  • Детерминированное

При выполнении случайного шифрования вектор инициализации создается произвольно. Во время шифрования открытого текста каждый раз создается другой зашифрованный текст. Это предотвращает утечку информации.

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

При детерминированном шифровании вектор инициализации не создается произвольно. Он извлекается из значения открытого текста с помощью следующего алгоритма:

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

Ключ вектора инициализации извлекается из ключа шифрования столбца следующим образом:

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

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

По сравнению с другими способами шифрования (например, использования предварительно определенного значения вектора инициализации), метод детерминированного шифрования более эффективно скрывает шаблоны.

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

После вычисления вектора инициализации создается зашифрованный текст AES_256_CBC :

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

Ключ шифрования извлекается из ключа шифрования столбца следующим образом:

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

Шаг 3. Вычисление имитовставки

Вычисление имитовставки происходит с помощью следующего алгоритма:

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

Зашифрованное значение создается путем объединения байтовой версии алгоритма, кода проверки подлинности сообщения, значения вектора инициализации и зашифрованного текста AES_256_CBC.

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 составляет 1 блок. Это равно 16 байтам.

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

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

Например:

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

  • После шифрования 2000-байтовое значение открытого текста типа nchar(1000) станет длинным двоичным значением размером 2065 байт.

Следующая таблица содержит полный список типов данных и длину зашифрованного текста для каждого типа.

Тип данных Длина зашифрованного текста (в байтах)
bigint 65
binary Возможны разные варианты. Рассчитывается по формуле выше.
bit 65
char Возможны разные варианты. Рассчитывается по формуле выше.
date 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 Не поддерживается.

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

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

См. также