カテゴリ:

暗号化機能

ENCRYPT

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

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

ENCRYPT_RAWDECRYPTDECRYPT_RAWTRY_DECRYPTTRY_DECRYPT_RAW

構文

ENCRYPT( <value_to_encrypt> , <passphrase> ,
         [ [ <additional_authenticated_data> , ] <encryption_method> ]
       )
Copy

引数

必須:

value_to_encrypt

暗号化する VARCHAR またはBINARY の値。

passphrase

データの暗号化/復号化に使用するパスフレーズ。 value_to_encrypt が VARCHAR か BINARY かに関係なく、パスフレーズは常に 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 です。

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

  • 最初のフィールドは初期化ベクトル(IV)です。IV は、 CTR-DRBG 乱数ジェネレーターを使用してランダムに生成されます。暗号化と復号化の両方で IV を使用します。

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

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

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

使用上の注意

  • 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 を使用します。

  • 初期化ベクトルは常にランダムに再生成されるため、同じ value_to_encryptpassphraseENCRYPT() を呼び出しても、毎回同じ結果が返されるとは限りません。同じ value_to_encryptpassphrase に対して同じ出力を生成する必要がある場合は、 ENCRYPT_RAW を使用して初期化ベクトルを指定することを検討してください。

この例では、単純なパスフレーズを使用して VARCHAR を暗号化します。

SELECT encrypt('Secret!', 'SamplePassphrase');
Copy

出力は、人間にとって読みにくいテキストです。

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

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

この例では、 value_to_encrypt と認証済みデータに BINARY 値を使用しています。

SELECT encrypt(to_binary(hex_encode('Secret!')), 'SamplePassphrase', to_binary(hex_encode('Authenticated Data')));
Copy

出力は次のとおりです。

6E1361E297C22969345F978A45205E3E98EB872844E3A0F151713894C273FAEF50C365S
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