カテゴリ:

暗号化機能

DECRYPT_RAW

BINARY キーを使用して BINARY 値を復号化します。

こちらもご参照ください。

ENCRYPT_RAW

構文

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

引数

必須:

復号化する値

復号化するバイナリ値。

キー

データの暗号化/復号化に使用するキー。キーは BINARY 値である必要があります。キーは、長さが正しい限り、任意の値にすることができます。たとえば、 AES128 の場合、キーは128ビット(16バイト)である必要があり、 AES256 の場合、キーは256ビット(32バイト)である必要があります。

値の暗号化に使用されたキーは、値の復号化に使用する必要があります。

iv

このパラメーターには、このデータを暗号化および復号化するために使用する初期化ベクトル(IV)が含まれています。IV は特定の長さの BINARY 値である必要があります。

  • GCM の場合は、96ビット(12バイト)である必要があります。

  • CCM の場合は、56ビット(7バイト)である必要があります。

  • ECB の場合、このパラメーターは不要です。

  • サポートされている他のすべての暗号化モードでは、128ビット(16バイト)である必要があります。

この値は、最初の暗号化ラウンドを初期化するために使用されます。特に GCM のような暗号化モードでは、同じ IV とキーの組み合わせを2回以上使用しないでください。

このパラメーターが NULL に設定されている場合、実装は各呼び出し中に新しい疑似ランダム IV を選択します。

オプション:

認証済み追加データ

認証済み追加データ(AAD)は、暗号化解除プロセス中に機密性と信頼性が保証される追加データです。ただし、この AAD は暗号化されておらず、 ENCRYPT または ENCRYPT_RAW 関数からの戻り値のフィールドとして含まれていません。

AAD が暗号化関数(ENCRYPT または ENCRYPT_RAW)に渡される場合は、同じ AAD が復号化関数(DECRYPT または DECRYPT_RAW)に渡される必要があります。復号化関数に渡された AAD が暗号化関数に渡された AAD と一致しない場合は、復号化に失敗します。

AAD と パスフレーズ の違いは、パスフレーズは秘密にしておくことを意図している(そうでない場合、暗号化は本質的に価値がない)のに対し、 AAD は公開したままにすることができます。AAD は、公開されている情報と暗号化された値が相互に関連付けられていることを認証するのに役立ちます。 ENCRYPT 関数の例のセクションには、 AAD が一致するときの動作と一致しないときの動作を示す例が含まれています。

ENCRYPT_RAW および DECRYPT_RAW の場合、 AAD のデータ型は BINARY である必要があります。ENCRYPT および DECRYPT の場合、 AAD のデータ型は VARCHAR または BINARY のいずれかであり、暗号化された値のデータ型と一致する必要はありません。

AAD GCM (デフォルト)などの AEAD 対応の暗号化モードでのみサポートされます。

暗号化の方法

この文字列は、データの暗号化/復号化に使用する方法を指定します。この文字列にはサブフィールドが含まれています。

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

algorithm には現在、次の制限があります。

  • 'AES' :パスフレーズが渡されると(例: ENCRYPT に対して)、関数は AES-256暗号化(256ビット)を使用します。キーが渡されると(例: ENCRYPT_RAW に対して)、関数はキーの長さに応じて、128、192、または256ビットの暗号化を使用します。

algorithm では、大文字と小文字が区別されません。

mode は、メッセージの暗号化に使用するブロック暗号モードを指定します。次のテーブルは、サポートされているモードと、パディングをサポートしているモードを示しています。

モード

パディング

説明

'ECB'

はい

キーを使用して、すべてのブロックを個別に暗号化します。このモードは一般的に推奨されておらず、外部実装との互換性のためにのみ含まれています。

'CBC'

はい

暗号化されたブロックは、前のブロックと XORed です。

'GCM'

いいえ

Galois/Counterモードは、 AEAD 対応の高性能暗号化モードです。AEAD はさらに、 AEAD タグを生成することにより、暗号化されたデータの信頼性と機密性を保証します。さらに、 AEAD は AAD (認証済み追加データ)をサポートします。

'CTR'

いいえ

カウンターモード。

'OFB'

いいえ

出力フィードバック。暗号文は、ブロックの平文を含む XORed です。

'CFB'

いいえ

暗号フィードバックは、 OFB と CBC の組み合わせです。

mode では、大文字と小文字が区別されません。

padding は、長さがブロックサイズの倍数ではないメッセージを埋め込む方法を指定します。パディングは ECB および CBC モードにのみ適用されます。他のモードでは、パディングは無視されます。パディングの可能な値は次のとおりです。

  • 'PKCS' :ブロックのパディングに PKCS5 を使用します。

  • 'NONE' :パディングなし。ECB または CBC モードを使用する場合、ユーザーはパディングに注意する必要があります。

padding では、大文字と小文字が区別されません。

デフォルト設定: 'AES-GCM'

mode が指定されていない場合は、 GCM が使用されます。

padding が指定されていない場合は、 PKCS が使用されます。

AEADタグ

この 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:フィールド名::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!!
    varchar_column VARCHAR,
    binary_column BINARY,
    encrypted_binary_column VARIANT,
    aad_column BINARY);

INSERT INTO binary_table (varchar_column,
                          encryption_key,
                          initialization_vector,
                          aad_column)
    SELECT 'Bonjour',
            SHA2('NotSecretEnough', 256),
            SUBSTR(TO_BINARY(HEX_ENCODE('AlsoNotSecretEnough'), 'hex'), 0, 12),
            TO_BINARY(HEX_ENCODE('additional data'))
    ;

UPDATE binary_table SET binary_column = TO_BINARY(HEX_ENCODE(varchar_column), '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" |                           |                       |
|                |                |         | }                                           |                           |                       |
+----------------+----------------+---------+---------------------------------------------+---------------------------+-----------------------+