카테고리:

암호화 함수

DECRYPT_RAW

BINARY 키를 사용하여 BINARY 값의 암호를 해독합니다.

참고 항목:

ENCRYPT_RAW

구문

DECRYPT_RAW( <value_to_decrypt> , <key> , <iv> ,
         [ [ [ <additional_authenticated_data> , ] <encryption_method> , ] <aead_tag> ]
       )

인자

필수:

value_to_decrypt

암호를 해독할 이진 값입니다.

key

데이터를 암호화/암호 해독하는 데 사용할 키입니다. 키는 BINARY 값이어야 합니다. 키는 길이가 올바른 한 어떤 값이든 될 수 있습니다. 예를 들어, AES128의 경우 키는 128비트(16바이트)여야 하고 AES256의 경우 키는 256비트(32바이트)여야 합니다.

값을 암호화하는 데 사용된 키는 값의 암호를 해독하는 데 사용해야 합니다.

iv

이 매개 변수에는 이 데이터 조각을 암호화하고 암호를 해독하는 데 사용할 초기화 벡터(IV)가 포함되어 있습니다. IV는 다음과 같이 특정 길이의 BINARY 값이어야 합니다.

  • GCM의 경우, 이 필드는 96비트(12바이트)여야 합니다. GCM 암호화 메서드를 사용하면 이 필드를 다른 크기로 지정할 수 있지만, Snowflake는 현재 96비트만 지원합니다.

  • CCM의 경우, 56비트(7바이트)여야 합니다.

  • ECB의 경우, 이 매개 변수가 필요하지 않습니다.

  • 지원되는 다른 모든 암호화 모드의 경우, 128비트(16바이트)여야 합니다.

이 값은 첫 번째 암호화 라운드를 초기화하는 데 사용됩니다. 동일한 IV 및 키 조합을 두 번 이상 사용해서는 안 됩니다. 특히 GCM과 같은 암호화 모드의 경우 더욱 그렇습니다.

이 매개 변수가 NULL로 설정된 경우, 구현은 각 호출 중에 새로운 의사 난수 IV를 선택합니다.

선택 사항:

additional_authenticated_data

추가 인증 데이터(AAD)는 암호 해독 과정에서 기밀성과 신뢰성이 보장되는 추가 데이터입니다. 그러나 이 AAD는 암호화되지 않으며, ENCRYPT 또는 ENCRYPT_RAW 함수에서 반환된 값의 필드로 포함되지 않습니다.

AAD가 암호화 함수(ENCRYPT 또는 ENCRYPT_RAW)에 전달되는 경우, 동일한 AAD가 암호 해독 함수(DECRYPT 또는 DECRYPT_RAW)에 전달되어야 합니다. 암호 해독 함수에 전달된 AAD가 암호화 함수에 전달된 AAD와 일치하지 않으면 암호 해독이 실패합니다.

AAD와 passphrase 의 차이점은 암호 구문은 시크릿으로 유지되도록 의도된 반면(그렇지 않으면 암호화는 본질적으로 무가치함) AAD는 공개 상태로 둘 수 있다는 것입니다. AAD는 정보의 공개 조각 및 암호화된 값이 서로 연관되어 있음을 인증하는 데 도움이 됩니다. ENCRYPT 함수의 예 섹션에는 AAD가 일치할 때의 동작과 일치하지 않을 때의 동작을 보여주는 예가 포함되어 있습니다.

ENCRYPT_RAW 및 DECRYPT_RAW의 경우, AAD의 데이터 타입은 BINARY여야 합니다. ENCRYPT 및 DECRYPT의 경우, AAD의 데이터 타입은 VARCHAR 또는 BINARY일 수 있으며, 암호화된 값의 데이터 타입과 일치할 필요가 없습니다.

AAD는 GCM(기본값)과 같은 AEAD 지원 암호화 모드에서만 지원됩니다.

encryption_method

이 문자열은 데이터의 암호화/암호 해독에 사용할 방법을 지정합니다. 이 문자열에는 다음과 같이 하위 필드가 포함됩니다.

<algorithm>-<mode> [ /pad: <padding> ]

algorithm 은 현재 다음으로 제한됩니다.

  • 'AES': 암호 구문이 전달되면(예: ENCRYPT) 이 함수는 AES-256 암호화(256비트)를 사용합니다. 키가 전달되면(예: ENCRYPT_RAW) 이 함수는 키 길이에 따라 128, 192 또는 256비트 암호화를 사용합니다.

algorithm 은 대/소문자를 구분하지 않습니다.

mode 는 메시지를 암호화하는 데 사용해야 하는 블록 암호 모드를 지정합니다. 다음 표는 지원되는 모드, 그리고 그중 어떤 모드가 패딩을 지원하는지 보여줍니다.

모드

패딩

설명

'ECB'

키로 모든 블록을 개별적으로 암호화합니다. 이 모드는 일반적으로 권장되지 않으며, 외부 구현과의 호환성을 위해서만 포함됩니다.

'CBC'

암호화된 블록은 이전 블록과 XOR됩니다.

'GCM'

아니요

Galois/Counter Mode는 AEAD가 지원되는 고성능 암호화 모드입니다. AEAD는 AEAD 태그를 생성하여, 암호화된 데이터의 신뢰성과 기밀성을 추가로 보장합니다. 또한, AEAD는 AAD(추가 인증 데이터)를 지원합니다.

'CTR'

아니요

카운터 모드입니다.

'OFB'

아니요

출력 피드백입니다. 암호 텍스트는 블록의 일반 텍스트와 XOR됩니다.

'CFB'

아니요

암호 피드백은 OFB와 CBC의 조합입니다.

mode 는 대/소문자를 구분하지 않습니다.

padding 은 길이가 블록 크기의 배수가 아닌 메시지를 채우는 방법을 지정합니다. 패딩은 ECB 및 CBC 모드에만 적용됩니다. 다른 모드에서는 패딩이 무시됩니다. 패딩에 가능한 값은 다음과 같습니다.

  • 'PKCS': 블록 패딩에 PKCS5를 사용합니다.

  • 'NONE': 패딩이 없습니다. 사용자는 ECB 또는 CBC 모드를 사용할 때 패딩을 처리해야 합니다.

padding 은 대/소문자를 구분하지 않습니다.

기본 설정: 'AES-GCM'.

mode 를 지정하지 않으면 GCM이 사용됩니다.

padding 을 지정하지 않으면 PKCS가 사용됩니다.

aead_tag

이 BINARY 값은 암호화된 데이터의 신뢰성과 기밀성을 AEAD 지원 암호 해독 모드가 확인하는 데 필요합니다. ENCRYPT_RAW 함수에서 반환된 AEAD 태그를 사용합니다. 아래 예는 이 값에 액세스하고 이를 사용하는 방법을 보여줍니다.

반환

함수는 암호가 해독된 값을 반환합니다. 반환된 값의 데이터 타입은 BINARY입니다.

사용법 노트

  • ENCRYPT() 로 암호화된 데이터의 암호를 해독하려면 DECRYPT() 를 사용하십시오. DECRYPT_RAW() 를 사용하지 마십시오.

  • ENCRYPT_RAW() 로 암호화된 데이터의 암호를 해독하려면 DECRYPT_RAW() 를 사용하십시오. DECRYPT() 를 사용하지 마십시오.

  • 함수의 매개 변수는 보안을 위해 마스킹됩니다. 다음과 같은 민감한 정보는 쿼리 로그에 표시되지 않으며 Snowflake에도 표시되지 않습니다.

    • 암호화하거나 암호를 해독할 문자열 또는 이진 값입니다.

    • 암호 구문 또는 키입니다.

  • 함수는 FIPS 호환 암호화 라이브러리를 사용하여 암호화 및 암호 해독을 효과적으로 수행합니다.

  • 데이터 조각의 암호를 해독하는 데 사용되는 암호 구문 또는 키는 해당 데이터를 암호화하는 데 사용되는 암호 구문 또는 키와 동일해야 합니다.

  • 암호화된 이진 값에서 필드(암호 텍스트, 초기화 벡터 또는 태그)를 추출할 때 다음을 사용하십시오.

    as_binary(get(encrypted_value, '<field_name>'))
    

    예를 들어 다음을 사용하십시오.

    as_binary(get(encrypted_value, 'ciphertext'))
    

    encrypted_value:field_name::binary 을 사용하지 마십시오. 필드 액세스 연산자 : 은 추출된 필드 값을 문자열로 변환합니다. 그러나 소스가 BINARY이기 때문에 해당 문자열은 항상 유효한 UTF-8 문자열은 아닙니다.

이 예는 암호화 및 암호 해독을 보여줍니다.

가독성을 위해 BINARY_OUTPUT_FORMAT을 HEX로 설정합니다.

ALTER SESSION SET BINARY_OUTPUT_FORMAT='HEX';

테이블을 만들고 로딩합니다.

조심

이 예를 단순화하기 위해 암호화/암호 해독 키는 암호화된 값이 있는 테이블에 저장됩니다. 이는 안전하지 않습니다. 키는 암호화된 데이터를 저장하는 테이블에서 암호화되지 않은 값으로 저장되어서는 절대 안 됩니다.

CREATE OR REPLACE TABLE binary_table (
    encryption_key BINARY,   -- DO NOT STORE REAL ENCRYPTION KEYS THIS WAY!
    initialization_vector BINARY(12), -- DO NOT STORE REAL IV'S THIS WAY!!
    binary_column BINARY,
    encrypted_binary_column VARIANT,
    aad_column BINARY);

INSERT INTO binary_table (encryption_key,
                          initialization_vector,
                          binary_column,
                          aad_column)
    SELECT SHA2_BINARY('NotSecretEnough', 256),
            SUBSTR(TO_BINARY(HEX_ENCODE('AlsoNotSecretEnough'), 'HEX'), 0, 12),
            TO_BINARY(HEX_ENCODE('Bonjour'), 'HEX'),
            TO_BINARY(HEX_ENCODE('additional data'), 'HEX')
    ;

암호화합니다.

UPDATE binary_table SET encrypted_binary_column =
    ENCRYPT_RAW(binary_column, 
        encryption_key, 
        initialization_vector, 
        aad_column,
        'AES-GCM');
+------------------------+-------------------------------------+
| number of rows updated | number of multi-joined rows updated |
|------------------------+-------------------------------------|
|                      1 |                                   0 |
+------------------------+-------------------------------------+

이는 DECRYPT_RAW() 함수에 대한 해당 호출을 보여줍니다. 초기화 벡터(IV)는 암호화된 값에서 가져옵니다. 초기화 벡터를 별도로 저장할 필요가 없습니다. 마찬가지로, AEAD 태그도 암호화된 값에서 읽습니다.

조심

이 예를 단순화하기 위해 암호화/암호 해독 키는 암호화된 값이 있는 테이블에서 읽습니다. 이는 안전하지 않습니다. 키는 암호화된 데이터를 저장하는 테이블에서 암호화되지 않은 값으로 저장되어서는 절대 안 됩니다.

SELECT 'Bonjour' as original_value,
       binary_column,
       hex_decode_string(to_varchar(binary_column)) as decoded,
       encrypted_binary_column,
       decrypt_raw(as_binary(get(encrypted_binary_column, 'ciphertext')),
                  encryption_key,
                  as_binary(get(encrypted_binary_column, 'iv')),
                  aad_column,
                  'AES-GCM',
                  as_binary(get(encrypted_binary_column, 'tag')))
           as decrypted,
       hex_decode_string(to_varchar(decrypt_raw(as_binary(get(encrypted_binary_column, 'ciphertext')),
                  encryption_key,
                  as_binary(get(encrypted_binary_column, 'iv')),
                  aad_column,
                  'AES-GCM',
                  as_binary(get(encrypted_binary_column, 'tag')))
                  ))
           as decrypted_and_decoded
    FROM binary_table;
+----------------+----------------+---------+---------------------------------------------+----------------+-----------------------+
| ORIGINAL_VALUE | BINARY_COLUMN  | DECODED | ENCRYPTED_BINARY_COLUMN                     | DECRYPTED      | DECRYPTED_AND_DECODED |
|----------------+----------------+---------+---------------------------------------------+----------------+-----------------------|
| Bonjour        | 426F6E6A6F7572 | Bonjour | {                                           | 426F6E6A6F7572 | Bonjour               |
|                |                |         |   "ciphertext": "CA2F4A383F6F55",           |                |                       |
|                |                |         |   "iv": "416C736F4E6F745365637265",         |                |                       |
|                |                |         |   "tag": "91F28FBC6A2FE9B213D1C44B8D75D147" |                |                       |
|                |                |         | }                                           |                |                       |
+----------------+----------------+---------+---------------------------------------------+----------------+-----------------------+

이전 예는 DECRYPT_RAW() 에 대한 긴 호출을 복제했습니다. 중복을 줄이기 위해 WITH 절을 사용할 수 있습니다.

WITH
    decrypted_but_not_decoded as (
        decrypt_raw(as_binary(get(encrypted_binary_column, 'ciphertext')),
                      encryption_key,
                      as_binary(get(encrypted_binary_column, 'iv')),
                      aad_column,
                      'AES-GCM',
                      as_binary(get(encrypted_binary_column, 'tag')))
    )
SELECT 'Bonjour' as original_value,
       binary_column,
       hex_decode_string(to_varchar(binary_column)) as decoded,
       encrypted_binary_column,
       decrypted_but_not_decoded,
       hex_decode_string(to_varchar(decrypted_but_not_decoded))
           as decrypted_and_decoded
    FROM binary_table;
+----------------+----------------+---------+---------------------------------------------+---------------------------+-----------------------+
| ORIGINAL_VALUE | BINARY_COLUMN  | DECODED | ENCRYPTED_BINARY_COLUMN                     | DECRYPTED_BUT_NOT_DECODED | DECRYPTED_AND_DECODED |
|----------------+----------------+---------+---------------------------------------------+---------------------------+-----------------------|
| Bonjour        | 426F6E6A6F7572 | Bonjour | {                                           | 426F6E6A6F7572            | Bonjour               |
|                |                |         |   "ciphertext": "CA2F4A383F6F55",           |                           |                       |
|                |                |         |   "iv": "416C736F4E6F745365637265",         |                           |                       |
|                |                |         |   "tag": "91F28FBC6A2FE9B213D1C44B8D75D147" |                           |                       |
|                |                |         | }                                           |                           |                       |
+----------------+----------------+---------+---------------------------------------------+---------------------------+-----------------------+
맨 위로 이동