カテゴリ:

暗号化機能

DECRYPT

VARCHAR パスフレーズを使用して BINARY 値を復号化します。

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

ENCRYPTENCRYPT_RAWDECRYPT_RAWTRY_DECRYPTTRY_DECRYPT_RAW

構文

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

引数

必須:

value_to_decrypt

復号化する BINARY 値。

passphrase

データの暗号化/復号化に使用するパスフレーズ。パスフレーズは VARCHAR です。

オプション:

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

戻り値

復号化された値を BINARY 値として返します。暗号化前の元の値が VARCHAR だった場合は、返された BINARY を明示的に VARCHAR に戻す必要があります。例:

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

より包括的な例については、以下の をご参照ください。

使用上の注意

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

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

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

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

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

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

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

  • パスフレーズの長さは任意で、0(空の文字列)でもかまいません。ただし、Snowflakeでは、少なくとも8バイトのパスフレーズを使用することを強くお勧めします。

  • パスフレーズは、大文字、小文字、数字、句読点を組み合わせて使用するなど、パスワードの一般的なベストプラクティスに従うことをお勧めします。

  • パスフレーズは、入力の暗号化/復号化に直接使用されません。代わりに、パスフレーズは、同じパスフレーズに対して常に同じである暗号化/復号化キーを取得するために使用されます。Snowflakeは、https://en.wikipedia.org/wiki/PBKDF2 キー派生関数とSnowflake内部のシードを使用して、指定されたパスフレーズから暗号化/復号化キーを計算します。

    こうしたキーの導出が原因のため、以下に対して暗号化/復号化機能は使用できません。

    • 外部で暗号化されたデータの復号化。

    • 外部で復号化されるデータの暗号化。

    これらのいずれかを実行するには、 ENCRYPT_RAW または DECRYPT_RAW を使用します。

以下のコードは、暗号化と復号化の簡単な例を示しています。

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

この例では、単純なパスフレーズを使用して BINARY 値を復号化します。この例では、バイナリ値は 16進数 形式で示されています。暗号化されたデータの値は、初期化ベクトル( 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

この例は、暗号化メソッドの指定子の一部として代替モード(CBC)を使用する方法を示しています。この暗号化方式は、パディングルール(PKCS)も指定します。この例では、 AAD パラメーターは NULL です。

select encrypt(to_binary(hex_encode('secret!')), 'sample_passphrase', NULL, 'aes-cbc/pad:pkcs') as encrypted_data;
Copy

次の例では、 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

間違った AAD を渡すと、復号化に失敗します。

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