カテゴリ:

暗号化機能

ENCRYPT_RAW

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

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

ENCRYPTDECRYPTDECRYPT_RAWTRY_DECRYPTTRY_DECRYPT_RAW

構文

ENCRYPT_RAW( <value_to_encrypt> , <key> , <iv> ,
         [ [ <additional_authenticated_data> , ] <encryption_method> ]
       )
Copy

引数

必須:

value_to_encrypt

暗号化するバイナリ値。

key

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

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

iv

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

  • GCM の場合、このフィールドは96ビット(12バイト)である必要があります。GCM 暗号化メソッドでは、このフィールドのサイズを変えることができますが、Snowflakeは現在96ビットのみをサポートしています。

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

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

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

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

このパラメーターが 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> ]
Copy

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 が使用されます。

戻り値

関数は暗号化された値を返します。戻り値のデータ型は VARIANT です。

返される値は1つだけですが、その値には2つまたは3つのフィールドが含まれます。

  • 最初のフィールドは初期化ベクトル(IV)です。暗号化と復号化の両方で IV を使用します。

  • 2番目のフィールドは、 value_to_encrypt の暗号文(暗号化された値)です。

  • 暗号化モードが AEAD 対応の場合、戻り値には、 AEAD タグである3番目のフィールドも含まれます。

IV とタグのサイズは、暗号化モードによって異なります。

VARIANT 内にある3つのフィールドの型はすべて BINARY です。

使用上の注意

  • ENCRYPT() により暗号化されたデータを復号化するには、 DECRYPT() を使用します。 DECRYPT_RAW() は使用しないでください。

  • ENCRYPT_RAW() により暗号化されたデータを復号化するには、 DECRYPT_RAW() を使用します。 DECRYPT() は使用しないでください。

  • 関数のパラメーターは、セキュリティのためにマスクされています。次のような機密情報はクエリログには表示されず、Snowflakeには表示されません。

    • 暗号化または復号化する文字列またはバイナリ値。

    • パスフレーズまたはキー。

  • 関数は FIPS 準拠の暗号ライブラリを使用して、暗号化と復号化を効率的に実行します。

  • データの復号化に使用されるパスフレーズまたはキーは、そのデータの暗号化に使用されるパスフレーズまたはキーと同じである必要があります。

この例は、暗号化と復号化を示しています。

読みやすくするために、 BINARY_OUTPUT_FORMAT を HEX に設定します。

ALTER SESSION SET BINARY_OUTPUT_FORMAT='HEX';
Copy

テーブルを作成し、データをロードします。

注意

この例を単純化するために、暗号化/復号化キーは、暗号化された値とともにテーブルに保存されます。これは安全ではありません。キーは、暗号化されたデータを保存するテーブルに、暗号化されていない値として 決して 保存しないでください。

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

暗号化:

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

これは、対応する 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" |                |                       |
|                |                |         | }                                           |                |                       |
+----------------+----------------+---------+---------------------------------------------+----------------+-----------------------+
Copy

前述の例では、 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" |                           |                       |
|                |                |         | }                                           |                           |                       |
+----------------+----------------+---------+---------------------------------------------+---------------------------+-----------------------+
Copy