Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
En este artículo se describen los algoritmos y mecanismos de cifrado para derivar material criptográfico usado en la característica Always Encrypted en SQL Server y Azure SQL Database. Estos algoritmos se aplican a todas las ediciones y versiones de Always Encrypted; Always Encrypted con y sin enclaves seguros usan el mismo algoritmo de cifrado.
Claves, almacenes de claves y algoritmos de cifrado de claves
Always Encrypted utiliza claves de dos tipos: claves maestras de columna y claves de cifrado de columna.
Una clave maestra de columna (CMK) es una clave de cifrado de claves (por ejemplo, una clave que se usa para cifrar otras claves). Asimismo, se encuentra siempre bajo el control del cliente y se almacena en un almacén de claves externo. Un controlador de cliente habilitado para Always Encrypted interactúa con el almacén de claves a través de un proveedor de almacén CMK, que puede formar parte de la biblioteca de controladores (un proveedor de Microsoft/sistema) o de la aplicación cliente (un proveedor personalizado). Actualmente, las bibliotecas de controladores de cliente incluyen proveedores de almacén de claves de Microsoft para el almacén de certificados de Windows y módulos de seguridad de hardware (HSM). Para obtener la lista actual de proveedores, consulte CREATE COLUMN MASTER KEY (Transact-SQL). Un desarrollador de aplicaciones puede proporcionar un proveedor personalizado para un almacén arbitrario.
Una clave de cifrado de columna (CEK) es una clave de cifrado de contenido (por ejemplo, una clave que se utiliza para proteger los datos) que está protegida por una CMK.
Todos los proveedores de almacenes CMK de Microsoft cifran los CEK mediante RSA con relleno de cifrado asimétrico óptimo (RSA-OAEP). El proveedor de almacén de claves compatible con Microsoft Cryptography API: Next Generation (CNG) en .NET Framework (clase SqlColumnEncryptionCngProvider) usa los parámetros predeterminados especificados por RFC 8017 en la sección A.2.1. Estos parámetros predeterminados utilizan una función hash de SHA-1 y una función de generación de máscara de MGF1 con SHA-1. Todos los demás proveedores de almacenes de claves usan SHA-256.
Always Encrypted usa internamente módulos criptográficos validados por FIPS 140-2.
Algoritmo de cifrado de datos
Always Encrypted usa el algoritmo AEAD_AES_256_CBC_HMAC_SHA_256 para cifrar los datos de la base de datos. AEAD significa Cifrado autenticado con datos asociados; HMAC significa código de autenticación de mensajes basado en hash; MAC significa código de autenticación de mensajes.
AEAD_AES_256_CBC_HMAC_SHA_256 se deriva del borrador de especificación de IETF. Utiliza un esquema de cifrado autenticado con asociados datos, con un enfoque conocido como "cifrar y, después, generar la MAC". Es decir, el texto no cifrado se cifra primero y se genera la MAC según el texto cifrado resultante.
Para ocultar los patrones, AEAD_AES_256_CBC_HMAC_SHA_256 usa el modo de funcionamiento Cipher Block Chaining (CBC), con el que se transmite un valor inicial al sistema conocido como el "vector de inicialización" (IV). La descripción completa del modo CBC se puede encontrar en el Instituto Nacional de Estándares y Tecnología (NIST) de EE. UU.
AEAD_AES_256_CBC_HMAC_SHA_256 calcula un valor de texto cifrado para un valor de texto no cifrado determinado siguiendo estos pasos.
Paso 1: generación del vector de inicialización (IV)
Always Encrypted admite dos variantes de AEAD_AES_256_CBC_HMAC_SHA_256:
Aleatorio
Determinista
Para el cifrado aleatorio, el IV se genera aleatoriamente. Como consecuencia, cada vez que se cifre el mismo texto no cifrado, se genera un texto cifrado distinto, lo que evita que se divulgue cualquier información.
When using randomized encryption: IV = Generate cryptographically random 128bits
Para el cifrado determinista, el IV no se genera aleatoriamente, sino que se deriva del valor de texto no cifrado mediante el algoritmo siguiente:
When using deterministic encryption: IV = HMAC-SHA-256( iv_key, cell_data ) truncated to 128 bits.
Donde iv_key se deriva de la CEK del siguiente modo:
iv_key = HMAC-SHA-256(CEK, "Microsoft SQL Server cell IV key" + algorithm + CEK_length)
Se realiza el truncamiento del valor HMAC para ajustar un bloque de datos según se necesite para el IV. Como resultado, el cifrado determinista siempre genera el mismo texto cifrado para un valor de texto no cifrado concreto, lo que permite deducir si dos valores de texto no cifrado son iguales al comparar sus correspondientes valores de texto cifrado. Esta divulgación de información limitada permite al sistema de base de datos admitir la comparación de igualdad en valores de columna cifrados.
El cifrado determinista resulta más eficaz para ocultar los patrones, en comparación con las alternativas (como el uso de un valor de IV predefinido).
Paso 2: Cálculo del texto cifrado AES_256_CBC
Para el algoritmo AEAD_AES_256_CBC_HMAC_SHA_256 de Always Encrypted, después de calcular el IV en el paso 1, se genera el texto cifrado AES_256_CBC :
aes_256_cbc_ciphertext = AES-CBC-256(enc_key, IV, cell_data) with PKCS7 padding.
Donde la clave de cifrado (enc_key) se deriva de la clave de cifrado de columna (CEK) como se indica a continuación:
enc_key = HMAC-SHA-256(CEK, "Microsoft SQL Server cell encryption key" + algorithm + CEK_length )
Paso 3: cálculo de la MAC
Para el algoritmo de AEAD_AES_256_CBC_HMAC_SHA_256 de Always Encrypted, el MAC (código de autenticación de mensajes) se calcula a partir del byte de versión, el IV (del paso 1) y el AES_256_CBC texto cifrado (del paso 2), mediante un mac_key derivado de la clave de cifrado de columna (CEK):
MAC = HMAC-SHA-256(mac_key, versionbyte + IV + Ciphertext + versionbyte_length)
Donde:
versionbyte = 0x01 and versionbyte_length = 1
mac_key = HMAC-SHA-256(CEK, "Microsoft SQL Server cell MAC key" + algorithm + CEK_length)
Paso 4: concatenación
Para el algoritmo de AEAD_AES_256_CBC_HMAC_SHA_256 de Always Encrypted, el valor cifrado final se genera mediante la concatenación del byte de versión del algoritmo, el MAC (del paso 3), el IV (del paso 1) y el AES_256_CBC texto cifrado (del paso 2):
aead_aes_256_cbc_hmac_sha_256 = versionbyte + MAC + IV + aes_256_cbc_ciphertext
Longitud del texto cifrado
Las longitudes (en bytes) de los componentes concretos del texto cifrado AEAD_AES_256_CBC_HMAC_SHA_256 son las siguientes:
| Componente | Tamaño (bytes) |
|---|---|
versionbyte |
1 |
MAC |
32 |
IV |
16 |
aes_256_cbc_ciphertext |
(FLOOR(DATALENGTH(cell_data) / block_size) + 1) * block_size, donde block_size es 16 bytes y cell_data es el valor de texto no cifrado. El tamaño mínimo de aes_256_cbc_ciphertext es un bloque (16 bytes). |
Por lo tanto, es posible calcular la longitud de un texto cifrado, que sea el resultado de cifrar valores de texto no cifrado determinados (cell_data), mediante la siguiente fórmula:
1 + 32 + 16 + (FLOOR(DATALENGTH(cell_data)/16) + 1) * 16
Por ejemplo:
Un valor de texto no cifrado int de tipo Long de 4 bytes se convierte en un valor binario Long de 65 bytes tras el cifrado.
Un valor de texto no cifrado de 2000 bytes long nchar(1000) se convierte en un valor binario largo de 2065 bytes después del cifrado.
La longitud del texto cifrado depende del tipo de datos de origen. Para los tipos de longitud fija, el resultado es una constante; para los tipos de longitud variable (char, nchar, varchar, nvarchar, binary, ), varbinaryuse la fórmula anterior. Los tipos marcados como N/A no se pueden cifrar con Always Encrypted. La siguiente tabla contiene una lista completa de tipos de datos y la longitud del texto cifrado para cada uno de ellos.
| Tipo de dato | Longitud del texto cifrado [bytes] |
|---|---|
| bigint | 65 |
| binary | Varía. Utilice la fórmula anterior. |
| bit | 65 |
| char | Varía. Utilice la fórmula anterior. |
| date | 65 |
| datetime | 65 |
| datetime2 | 65 |
| datetimeoffset | 65 |
| decimal | 81 |
| float | 65 |
| geography | N/D (no compatible). |
| geometry | N/D (no compatible). |
| hierarchyid | N/D (no compatible). |
| image | No aplicable (no admitido) |
| int | 65 |
| money | 65 |
| nchar | Varía. Utilice la fórmula anterior. |
| ntext | No aplicable (no admitido) |
| numeric | 81 |
| nvarchar | Varía. Utilice la fórmula anterior. |
| real | 65 |
| smalldatetime | 65 |
| smallint | 65 |
| smallmoney | 65 |
| sql_variant | No aplicable (no admitido) |
| sysname | No aplicable (no admitido) |
| text | No aplicable (no admitido) |
| time | 65 |
|
timestamp (rowversion) |
No aplicable (no admitido) |
| tinyint | 65 |
| uniqueidentifier | 81 |
| varbinary | Varía. Utilice la fórmula anterior. |
| varchar | Varía. Utilice la fórmula anterior. |
| xml | No aplicable (no admitido) |
referencia de .NET
Para obtener más información sobre los algoritmos descritos en este artículo, consulte los archivos SqlAeadAes256CbcHmac256Algorithm.cs, SqlColumnEncryptionCertificateStoreProvider.cs y SqlColumnEncryptionCngProvider.cs en la referencia de .NET.