Categorias:

Funções de criptografia

DECRYPT

Descriptografa um valor BINARY usando uma frase secreta VARCHAR.

Consulte também:

ENCRYPT , ENCRYPT_RAW , DECRYPT_RAW , TRY_DECRYPT , TRY_DECRYPT_RAW

Sintaxe

DECRYPT( <value_to_decrypt> , <passphrase> ,
         [ [ <additional_authenticated_data> , ] <encryption_method> ]
       )
Copy

Argumentos

Obrigatório:

value_to_decrypt

O valor BINARY a ser descriptografado.

passphrase

A senha a ser usada para criptografar/descriptografar os dados. A frase secreta é um VARCHAR.

Opcional:

additional_authenticated_data

Dados 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_method

Esta 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> ]
Copy

O algorithm está 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 algorithm não diferencia maiúsculas e minúsculas.

O mode especifica 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 mode não diferencia maiúsculas e minúsculas.

O padding especifica 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 padding não diferencia maiúsculas e minúsculas.

Configuração padrão: 'AES-GCM'.

Se o mode não for especificado, é utilizado GCM.

Se o padding não for especificado, é utilizado PKCS.

Retornos

Retorna o valor descriptografado como um valor BINARY. Se o valor original antes da criptografia era VARCHAR, você deve converter explicitamente o retorno BINARY de volta para VARCHAR. Por exemplo:

... TO_VARCHAR(DECRYPT(ENCRYPT('secret', 'key'), 'key'), 'utf-8') ...
Copy

Para exemplos mais completos, consulte os Exemplos abaixo.

Notas de uso

  • Para descriptografar dados criptografados por ENCRYPT(), use DECRYPT(). Não usar DECRYPT_RAW().

  • Para descriptografar dados criptografados por ENCRYPT_RAW(), use DECRYPT_RAW(). Não usar DECRYPT().

  • 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.

Exemplos

O código abaixo mostra um exemplo simples de criptografia e descriptografia:

SET passphrase='poiuqewjlkfsd';
Copy
SELECT
    TO_VARCHAR(
        DECRYPT(
            ENCRYPT('Patient tested positive for COVID-19', $passphrase),
            $passphrase),
        'utf-8')
        AS dcrypt
    ;
+--------------------------------------+
| DCRYPT                               |
|--------------------------------------|
| Patient tested positive for COVID-19 |
+--------------------------------------+
Copy

Este exemplo descriptografa um valor BINARY com uma frase secreta simples. Neste exemplo, os valores binários são mostrados no formato hexadecimal. O valor dos dados criptografados pode variar devido à aleatoriedade do vetor de inicialização (descrito brevemente em ENCRYPT).

ALTER SESSION SET BINARY_OUTPUT_FORMAT='hex';
Copy
CREATE TABLE binary_table (
    binary_column BINARY,
    encrypted_binary_column BINARY);
INSERT INTO binary_table (binary_column) 
    SELECT (TO_BINARY(HEX_ENCODE('Hello')));
UPDATE binary_table 
    SET encrypted_binary_column = ENCRYPT(binary_column, 'SamplePassphrase');
Copy
SELECT 'Hello' as original_value,
       binary_column, 
       hex_decode_string(to_varchar(binary_column)) as decoded,
       -- encrypted_binary_column,
       decrypt(encrypted_binary_column, 'SamplePassphrase') as decrypted,
       hex_decode_string(to_varchar(decrypt(encrypted_binary_column, 'SamplePassphrase'))) as decrypted_and_decoded
    FROM binary_table;
+----------------+---------------+---------+------------+-----------------------+
| ORIGINAL_VALUE | BINARY_COLUMN | DECODED | DECRYPTED  | DECRYPTED_AND_DECODED |
|----------------+---------------+---------+------------+-----------------------|
| Hello          | 48656C6C6F    | Hello   | 48656C6C6F | Hello                 |
+----------------+---------------+---------+------------+-----------------------+
Copy

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;
Copy

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 |
+------------+
Copy

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
    ;
Copy
100311 (22023): Decryption failed. Check encrypted data, key, AAD, or AEAD tag.
Copy