- Categorias:
ENCRYPT¶
Criptografa um valor VARCHAR ou BINARY usando uma frase secreta VARCHAR.
- Consulte também:
ENCRYPT_RAW , DECRYPT , DECRYPT_RAW , TRY_DECRYPT , TRY_DECRYPT_RAW
Sintaxe¶
ENCRYPT( <value_to_encrypt> , <passphrase> ,
[ [ <additional_authenticated_data> , ] <encryption_method> ]
)
Argumentos¶
Obrigatório:
value_to_encryptO valor VARCHAR ou BINARY para criptografar.
passphraseA senha a ser usada para criptografar/descriptografar os dados. A senha é sempre um VARCHAR, independentemente de o
value_to_encryptser VARCHAR ou BINARY.
Opcional:
additional_authenticated_dataDados autenticados adicionais (AAD) são dados adicionais cuja confidencialidade e autenticidade são asseguradas durante o processo de descriptografia. Entretanto, este AAD não é criptografado e não está incluído como campo no valor retornado da função ENCRYPT ou ENCRYPT_RAW.
Se AAD for passado para a função de criptografia (ENCRYPT ou ENCRYPT_RAW), então o mesmo AAD deve ser passado para a função de descriptografia (DECRYPT ou DECRYPT_RAW). Se AAD passado para a função de descriptografia não corresponder ao AAD passado para a função de criptografia, então a descriptografia falha.
A diferença entre o AAD e o
passphraseé que a frase secreta deve ser mantida em segredo (caso contrário, a criptografia é essencialmente inútil), enquanto o AAD pode ser deixado público. O AAD ajuda a autenticar que uma informação pública e um valor criptografado estão associados uns aos outros. A seção de exemplos na função ENCRYPT inclui um exemplo mostrando o comportamento quando o AAD é correspondente e o comportamento quando não é correspondente.Para ENCRYPT_RAW e DECRYPT_RAW, o tipo de dados do AAD deve ser BINARY. Para ENCRYPT e DECRYPT, o tipo de dados do AAD pode ser VARCHAR ou BINARY, e não precisa corresponder ao tipo de dados do valor que foi criptografado.
AAD é suportado somente por modos de criptografia habilitados para AEAD, como GCM (padrão).
encryption_methodEsta cadeia de caracteres especifica o método a ser usado para criptografar/descriptografar os dados. Esta cadeia de caracteres contém subcampos:
<algorithm>-<mode> [ /pad: <padding> ]
O
algorithmestá atualmente limitado a:'AES': quando uma senha é passada (por exemplo, para ENCRYPT), a função usa criptografia AES-256 (256 bits). Quando uma chave é passada (por exemplo, para ENCRYPT_RAW), a função usa criptografia de 128, 192 ou 256 bits, dependendo do comprimento da chave.
O
algorithmnão diferencia maiúsculas e minúsculas.O
modeespecifica que modo de codificação de bloco deve ser usado para criptografar mensagens. A tabela a seguir mostra quais modos são suportados, e quais desses modos suportam o preenchimento:Modo
Preenchimento
Descrição
'ECB'Sim
Criptografar cada bloco individualmente com a chave. Este modo é geralmente desencorajado e está incluído apenas para compatibilidade com implementações externas.
'CBC'Sim
O bloco criptografado é XORed com o bloco anterior.
'GCM'Não
O Modo Galois/Contador é um modo de criptografia de alto desempenho habilitado para AEAD. AEAD também garante a autenticidade e a confidencialidade dos dados criptografados, gerando uma tag AEAD. Além disso, AEAD oferece suporte a AAD (dados autenticados adicionais).
'CTR'Não
Modo contador.
'OFB'Não
Feedback de saída. O texto cifrado é XORed com o texto sem formatação de um bloco.
'CFB'Não
O feedback da cifra é uma combinação de OFB e CBC.
O
modenão diferencia maiúsculas e minúsculas.O
paddingespecifica como preencher mensagens cujo comprimento não seja múltiplo do tamanho do bloco. O preenchimento é aplicável somente para os modos ECB e CBC; o preenchimento é ignorado para outros modos. Os valores possíveis para o preenchimento são:'PKCS': utiliza PKCS5 para preenchimento de blocos.'NONE': sem preenchimento. O usuário precisa cuidar do preenchimento ao usar o modo ECB ou CBC.
O
paddingnão diferencia maiúsculas e minúsculas.Configuração padrão:
'AES-GCM'.Se o
modenão for especificado, é utilizado GCM.Se o
paddingnão for especificado, é utilizado PKCS.
Retornos¶
O tipo de dados do valor retornado é BINARY.
Embora apenas um valor seja retornado, esse valor contém dois ou três campos concatenados:
O primeiro campo é um vetor de inicialização (IV). O IV é gerado aleatoriamente usando um gerador de números aleatórios CTR-DRBG. Tanto a criptografia quanto a descriptografia utilizam o IV.
O segundo campo é o texto cifrado (valor criptografado) do
value_to_encrypt.Se o modo de criptografia estiver habilitado para AEAD, então o valor retornado também contém um terceiro campo, que é a tag AEAD.
O IV e o tamanho da tag dependem do modo de criptografia.
Notas de uso¶
Para descriptografar dados criptografados por
ENCRYPT(), useDECRYPT(). Não usarDECRYPT_RAW().Para descriptografar dados criptografados por
ENCRYPT_RAW(), useDECRYPT_RAW(). Não usarDECRYPT().Os parâmetros da função são mascarados para segurança. Informações sensíveis como as seguintes não são visíveis no log de consulta e não são visíveis para o Snowflake:
O valor da cadeia de caracteres ou binário para criptografar ou descriptografar.
A frase secreta ou senha.
As funções utilizam uma biblioteca criptográfica compatível com FIPS para realizar a criptografia e descriptografia de forma eficaz.
A senha ou chave usada para decodificar um dado deve ser a mesma que a senha ou chave usada para codificar esses dados.
A frase secreta pode ser de comprimento arbitrário, mesmo 0 (a cadeia de caracteres vazia). Entretanto, o Snowflake recomenda fortemente o uso de uma frase secreta que tenha pelo menos 8 bytes.
O Snowflake recomenda que a frase secreta siga as práticas recomendadas gerais para senhas, como o uso de uma mistura de letras maiúsculas, minúsculas, números e pontuação.
A senha não é usada diretamente para criptografar/descriptografar a entrada. Em vez disso, a frase secreta é usada para derivar uma chave de criptografia/descriptografia, que é sempre a mesma para a mesma frase secreta. O Snowflake usa a função de derivação de chave https://en.wikipedia.org/wiki/PBKDF2 com uma semente interna do Snowflake para calcular a chave de criptografia/descriptografia a partir da frase secreta dada.
Devido a esta derivação de chave, a função de criptografia/descriptografia não pode ser usada:
Descriptografar dados que foram criptografados externamente.
Criptografar dados que serão descriptografados externamente.
Para fazer qualquer um destes, use ENCRYPT_RAW ou DECRYPT_RAW.
Como o vetor de inicialização é sempre regenerado aleatoriamente, chamar
ENCRYPT()com o mesmovalue_to_encryptepassphrasenão retorna o mesmo resultado todas as vezes. Se você precisar gerar a mesma saída para o mesmovalue_to_encryptepassphrase, considere usar ENCRYPT_RAW e especificar o vetor de inicialização.
Exemplos¶
Este exemplo criptografa um VARCHAR com uma simples frase secreta.
SELECT encrypt('Secret!', 'SamplePassphrase');A saída é um texto que não é fácil de ler para os seres humanos.
O código abaixo mostra um exemplo simples de criptografia e descriptografia:
SET passphrase='poiuqewjlkfsd';SELECT TO_VARCHAR( DECRYPT( ENCRYPT('Patient tested positive for COVID-19', $passphrase), $passphrase), 'utf-8') AS decrypted ; +--------------------------------------+ | DECRYPTED | |--------------------------------------| | Patient tested positive for COVID-19 | +--------------------------------------+
Este exemplo usa um valor BINARY para o value_to_encrypt e para os dados autenticados.
SELECT encrypt(to_binary(hex_encode('Secret!')), 'SamplePassphrase', to_binary(hex_encode('Authenticated Data')));A saída é:
6E1361E297C22969345F978A45205E3E98EB872844E3A0F151713894C273FAEF50C365S
Este exemplo mostra como usar um modo alternativo (CBC) como parte do especificador para o método de criptografia. Este método de criptografia também especifica uma regra de preenchimento (PKCS). Neste exemplo, o parâmetro AAD é NULL.
SELECT encrypt(to_binary(hex_encode('secret!')), 'sample_passphrase', NULL, 'aes-cbc/pad:pkcs') as encrypted_data;
Este exemplo mostra como usar o AAD:
SELECT
TO_VARCHAR(
DECRYPT(
ENCRYPT('penicillin', $passphrase, 'John Dough AAD', 'aes-gcm'),
$passphrase, 'John Dough AAD', 'aes-gcm'),
'utf-8')
AS medicine
;
+------------+
| MEDICINE |
|------------|
| penicillin |
+------------+
Se você passar o AAD errado, a descriptografia falha:
SELECT
DECRYPT(
ENCRYPT('penicillin', $passphrase, 'John Dough AAD', 'aes-gcm'),
$passphrase, 'wrong patient AAD', 'aes-gcm') AS medicine
;
100311 (22023): Decryption failed. Check encrypted data, key, AAD, or AEAD tag.