Partilhar via


Criptografia sempre criptografada

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada SQL do Azure

Este documento descreve algoritmos e mecanismos de encriptação para derivar material criptográfico utilizado na funcionalidade Always Encrypted no SQL Server e na Azure SQL Database.

Chaves, armazenamentos de chaves e algoritmos de encriptação de chaves

O Always Encrypted utiliza dois tipos de chaves: chaves mestras de coluna e chaves de encriptação de colunas.

Uma chave mestra de coluna (CMK) é uma chave de encriptação de chaves (por exemplo, uma chave usada para encriptar outras chaves) que está sempre sob controlo do cliente e é armazenada num armazenamento externo de chaves. Um driver cliente ativado pelo Always Encrypted interage com o armazenamento de chaves através de um fornecedor de armazenamento CMK, que pode fazer parte da biblioteca de drivers (um fornecedor Microsoft/do sistema) ou da aplicação cliente (um fornecedor personalizado). As bibliotecas de drivers do cliente incluem atualmente fornecedores de armazenamento de chaves Microsoft para a Loja de Certificados do Windows e módulos de segurança de hardware (HSMs). Para a lista atual de fornecedores, veja CRIAR CHAVE MESTRA DE COLUNA (Transact-SQL). Um programador de aplicações pode fornecer um fornecedor personalizado para uma loja arbitrária.

Uma chave de encriptação de coluna (CEK) é uma chave de encriptação de conteúdo (por exemplo, uma chave usada para proteger dados) que é protegida por uma CMK.

Todos os fornecedores de armazenamento Microsoft CMK cifram CEKs usando RSA com Optimal Asymmetric Encryption Padding (RSA-OAEP). O fornecedor de armazenamento de chaves que suporta Microsoft Cryptography API: Next Generation (CNG) no .NET Framework (SqlColumnEncryptionCngProvider Class) utiliza os parâmetros predefinidos especificados pelo RFC 8017 na Secção A.2.1. Estes parâmetros predefinidos estão a utilizar uma função hash de SHA-1 e uma função de geração de máscara de MGF1 com SHA-1. Todos os outros fornecedores de lojas chave utilizam o SHA-256.

O Always Encrypted utiliza internamente módulos criptográficos validados pelo FIPS 140-2.

Algoritmo de Encriptação de Dados

O Always Encrypted utiliza o algoritmo AEAD_AES_256_CBC_HMAC_SHA_256 para encriptar dados na base de dados.

AEAD_AES_256_CBC_HMAC_SHA_256 é derivado do rascunho da especificação em https://tools.ietf.org/html/draft-mcgrew-aead-aes-cbc-hmac-sha2-05. Utiliza um esquema de Encriptação Autenticada com Dados Associados, seguindo uma abordagem Encrypt-then-MAC. Ou seja, o texto simples é primeiro encriptado e o MAC é produzido com base no texto cifrado resultante.

Para ocultar padrões, AEAD_AES_256_CBC_HMAC_SHA_256 utiliza o modo de operação Cipher Block Chaining (CBC), onde um valor inicial é introduzido no sistema chamado vetor de inicialização (IV). A descrição completa do modo CBC pode ser encontrada em https://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf.

AEAD_AES_256_CBC_HMAC_SHA_256 calcula um valor de texto cifrado para um dado valor de texto simples usando os seguintes passos.

Passo 1: Geração do vetor de inicialização (IV)

O Always Encrypted suporta duas variações de AEAD_AES_256_CBC_HMAC_SHA_256:

  • Randomizado

  • Determinística

Para encriptação aleatória, o IV é gerado aleatoriamente. Como resultado, cada vez que o mesmo texto simples é encriptado, é gerado um texto cifrado diferente, o que impede qualquer divulgação de informação.

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

Se existir encriptação determinística, o IV não é gerado aleatoriamente, mas sim derivado do valor do texto simples usando o seguinte algoritmo:

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

Onde iv_key é derivado do CEK da seguinte forma:

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

O truncamento dos valores HMAC é realizado para ajustar um bloco de dados conforme necessário para o IV. Como resultado, a encriptação determinística produz sempre o mesmo texto cifrado para um dado valor de texto simples, o que permite inferir se dois valores de texto simples são iguais comparando os seus valores correspondentes de texto cifrado. Esta divulgação restrita de informação permite ao sistema de bases de dados suportar a comparação de igualdade em valores de coluna encriptados.

A encriptação determinística é mais eficaz em ocultar padrões, comparada com alternativas, como o uso de um valor IV pré-definido.

Passo 2: Computação do Texto Cifrado AES_256_CBC

Após calcular o IV, é gerado o AES_256_CBC texto cifrado:

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

Onde a chave de encriptação (enc_key) é derivada do CEK da seguinte forma.

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

Passo 3: Cálculo do MAC

Subsequentemente, o MAC é calculado usando o seguinte algoritmo:

MAC = HMAC-SHA-256(mac_key, versionbyte + IV + Ciphertext + versionbyte_length)  

Where:

versionbyte = 0x01 and versionbyte_length = 1
mac_key = HMAC-SHA-256(CEK, "Microsoft SQL Server cell MAC key" + algorithm + CEK_length)  

Passo 4: Concatenação

Finalmente, o valor encriptado é produzido concatenando o byte de versão do algoritmo, o MAC, o IV e o AES_256_CBC texto cifrado:

aead_aes_256_cbc_hmac_sha_256 = versionbyte + MAC + IV + aes_256_cbc_ciphertext  

Comprimento do Texto Cifrado

Os comprimentos (em bytes) de componentes particulares do texto cifrado AEAD_AES_256_CBC_HMAC_SHA_256 são:

  • Byte de versão: 1

  • MAC: 32

  • IV: 16

  • aes_256_cbc_ciphertext: (FLOOR (DATALENGTH(cell_data)/ block_size) + 1)* block_size, onde:

    • block_size é de 16 bytes

    • cell_data é um valor de texto simples

    Portanto, o tamanho mínimo de aes_256_cbc_ciphertext é 1 bloco, que corresponde a 16 bytes.

Assim, o comprimento do texto cifrado, resultante da encriptação de um dado valor de texto simples (cell_data), pode ser calculado usando a seguinte fórmula:

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

Por exemplo:

  • Um valor de texto simples int com 4 bytes torna-se um valor binário de 65 bytes após a encriptação.

  • Um valor nchar(1000) de texto simples com 2.000 bytes torna-se um valor binário de 2.065 bytes após a encriptação.

A tabela seguinte contém uma lista completa de tipos de dados e o comprimento do texto cifrado para cada tipo.

Tipo de dados Comprimento do texto cifrado [bytes]
bigint 65
binary Varia. Usa a fórmula acima.
bit 65
char Varia. Usa a fórmula acima.
date 65
datetime 65
datetime2 65
datetimeoffset 65
decimal 81
float 65
geography N/D (não suportado)
geometry N/D (não suportado)
hierarchyid N/D (não suportado)
image N/D (não suportado)
int 65
dinheiro 65
Nchar Varia. Usa a fórmula acima.
ntext N/D (não suportado)
numérico 81
nvarchar Varia. Usa a fórmula acima.
real 65
smalldatetime 65
smallint 65
dinheiro pequeno 65
sql_variant N/D (não suportado)
sysname N/D (não suportado)
texto N/D (não suportado)
time 65
timestamp

(rowversion)
N/D (não suportado)
tinyint 65
uniqueidentifier 81
Varbinary Varia. Usa a fórmula acima.
Varchar Varia. Usa a fórmula acima.
xml N/D (não suportado)

Referência .NET

Para detalhes sobre os algoritmos, discutidos neste documento, consulte os ficheiros SqlAeadAes256CbcHmac256Algorithm.cs, SqlColumnEncryptionCertificateStoreProvider.cs e SqlColumnEncryptionCertificateStoreProvider.cs na Referência .NET.

Consulte também