暗号化関数 ​

このページは機械翻訳により提供されています。翻訳内容と英語版に相違がある場合は、英語版が優先されます。

暗号化関数は、インテグレーションで実際に必要な暗号技術を扱います。たとえば、webhookが主張どおりの送信者から送信されたことの証明、送信APIリクエストへの署名、JWTの生成、チェックサムの計算などです。

これらの関数はセキュリティ設計ではありません

暗号化関数は標準アルゴリズムを正しく実装しますが、設計を安全にすることはできません。

  • シークレットを式に入れないでください: レシピに書き込まれたキーは、そのレシピを表示できるすべてのユーザーに表示され、すべてのエクスポートに含まれます。安全なソースからの入力としてシークレットを渡します。
  • ハッシュ化は暗号化ではありません: ハッシュから元の値を復元することはできません。ハッシュはチェックサムや署名に使用し、可逆的なデータ保護には使用しないでください。
  • 低エントロピー値のダイジェストは推測可能です: メールアドレスをハッシュ化しても匿名化されません。攻撃者が全空間を列挙できるためです。

機能の提供状況

WELは現在、一部のお客様にご利用いただけます。ご利用のワークスペースで利用可能かどうかを確認するには、Customer Success Representativeにお問い合わせください。

アルゴリズムの選択 ​

ユースケースに最適なアルゴリズムを使用します。

ユースケースアルゴリズム
webhook署名の検証hmac_hex_sha256
送信リクエストへの署名hmac_hex_sha256
ファイルのチェックサム計算hex_sha256
パートナーのレガシースキームとの照合hex_md5またはhex_sha1、必要な場合のみ
パスワードからキーを導出pbkdf2
トークンの発行または確認jwt_encode、jwt_decode

MD5とSHA-1は破られています。セキュリティ上重要な用途には使用しないでください。 WELがこれらを提供しているのは、インテグレーションで、これらをまだ使用しているパートナーシステムに合わせる必要がある場合があるためです。新しい作業には選択しないでください。

命名規則 ​

各アルゴリズムには、hex_プレフィックスで区別される2つの形式があります。

  • sha256(...)はBinaryダイジェスト、つまり生バイトを返します。
  • hex_sha256(...)は16進文字のStringを返します。

16進形式を署名ヘッダーと比較するか、JSONフィールドに入れます。ダイジェストを別の関数に渡す場合は、Binary形式を使用します。

ハッシュ化 ​

すべてのハッシュ関数はStringまたはBinaryを受け入れます。

hex_sha256とsha256 ​

SHA-256は新しい作業のデフォルトの選択肢です。

text
hex_sha256(value)
sha256(value)
パラメーター説明
valueハッシュ化するStringまたはBinary。
SHA-256で文字列をハッシュ化

次の例では、SHA-256で文字列をハッシュ化し、16進ダイジェストを返します。

Formula

text
hex_sha256('acme')

出力

text
822b33ad87c148a0a20a5ba7cd5ebcaa68d36a18e7aad165554903f52ca82757
生のSHA-256ダイジェストのバイト長を測定

次の例では、生のバイナリダイジェストのバイト長を測定します。

Formula

text
byte_length(sha256('acme'))

出力

text
32

hex_sha512とsha512 ​

SHA-512は、同じファミリーからより長いダイジェストを生成します。

text
hex_sha512(value)
sha512(value)
パラメーター説明
valueハッシュ化するStringまたはBinary。
SHA-512ダイジェストのバイト長を測定

次の例では、生のバイナリダイジェストのバイト長を測定します。

Formula

text
byte_length(sha512('acme'))

出力

text
64

hex_sha512_256とsha512_256 ​

SHA-512/256は256ビットのダイジェストを生成し、SHA-256の長さ拡張特性を回避します。

シークレットとメッセージをハッシュ化する場合に使用します。ただし、その場合はHMACの方がより直接的に処理でき、通常はより適した選択肢です。

text
hex_sha512_256(value)
sha512_256(value)
パラメーター説明
valueハッシュ化するStringまたはBinary。
SHA-512/256で文字列をハッシュ化

次の例では、SHA-512/256で文字列をハッシュ化し、16進ダイジェストを返します。

Formula

text
hex_sha512_256('acme')

出力

text
2e7a8d79ac01f85db494bfddf90cc808d091543addc18bb68ad643257234735a

hex_sha1とsha1 ​

SHA-1はレガシー専用であり、まだ必要としているシステムとの互換性のために保持されています。

text
hex_sha1(value)
sha1(value)
パラメーター説明
valueハッシュ化するStringまたはBinary。
SHA-1で文字列をハッシュ化

次の例では、SHA-1で文字列をハッシュ化し、16進ダイジェストを返します。

Formula

text
hex_sha1('acme')

出力

text
293abb6b76d7791c0732cc517d38c4b5c734b87f

hex_md5とmd5 ​

MD5はレガシー専用であり、敵対的でないチェックサムにのみ適しています。

text
hex_md5(value)
md5(value)
パラメーター説明
valueハッシュ化するStringまたはBinary。
MD5で文字列をハッシュ化

次の例では、MD5で文字列をハッシュ化し、16進ダイジェストを返します。

Formula

text
hex_md5('acme')

出力

text
53bce4f1dfa0fe8e7ca126f91b35d3a6

HMAC署名 ​

HMACは、メッセージと共有シークレットを組み合わせて署名を生成します。 webhookプロバイダーは通常、信頼された送信者からリクエストが送信されたことを検証するためにHMAC署名を使用します。

すべてのHMAC関数は、メッセージを先に、キーを後に取ります。

hmac_hexとhmac ​

引数として指定されたアルゴリズムでHMACを計算します。

text
hmac_hex(message, key, algorithm)
hmac(message, key, algorithm)
パラメーター説明
message署名するデータ。
key共有シークレット。
algorithmsha256、sha384、sha512、またはレガシーのmd5とsha1。大文字と小文字は区別されません。
HMAC-SHA256署名を16進形式で計算

次の例では、HMAC-SHA256署名を計算し、16進文字列として返します。

Formula

text
hmac_hex('payload', 'secret', 'sha256')

出力

text
b82fcb791acec57859b989b430a826488ce2e479fdf92326bd0a2e8375a42ba4
生のHMACダイジェストのバイト長を測定

次の例では、生のバイナリHMACダイジェストのバイト長を測定します。

Formula

text
byte_length(hmac('payload', 'secret', 'sha256'))

出力

text
32

hmac_algos ​

サポートされているHMACアルゴリズムを一覧表示します。

text
hmac_algos()
サポートされているHMACアルゴリズムを一覧表示

次の例では、サポートされているHMACアルゴリズムを一覧表示します。

Formula

text
hmac_algos()

出力

text
["md5", "sha1", "sha256", "sha384", "sha512"]

hmac_hex_sha256とhmac_sha256 ​

ほとんどのwebhookプロバイダーはHMAC-SHA256を使用します。

text
hmac_hex_sha256(message, key)
hmac_sha256(message, key)
パラメーター説明
message署名するデータ。
key共有シークレット。
HMAC-SHA256署名を計算

次の例では、HMAC-SHA256署名を計算し、16進文字列として返します。

Formula

text
hmac_hex_sha256('payload', 'secret')

出力

text
b82fcb791acec57859b989b430a826488ce2e479fdf92326bd0a2e8375a42ba4

hmac_hex_sha384とhmac_sha384 ​

HMAC-SHA384はHMAC-SHA256と同様に機能し、より長いダイジェストを使用します。

text
hmac_hex_sha384(message, key)
hmac_sha384(message, key)
パラメーター説明
message署名するデータ。
key共有シークレット。
HMAC-SHA384ダイジェストのバイト長を測定

次の例では、生のバイナリHMACダイジェストのバイト長を測定します。

Formula

text
byte_length(hmac_sha384('payload', 'secret'))

出力

text
48

hmac_hex_sha512とhmac_sha512 ​

HMAC-SHA512はHMAC-SHA256と同様に機能し、HMAC-SHA384よりさらに長いダイジェストを使用します。

text
hmac_hex_sha512(message, key)
hmac_sha512(message, key)
パラメーター説明
message署名するデータ。
key共有シークレット。
HMAC-SHA512ダイジェストのバイト長を測定

次の例では、生のバイナリHMACダイジェストのバイト長を測定します。

Formula

text
byte_length(hmac_sha512('payload', 'secret'))

出力

text
64

hmac_hex_sha1とhmac_sha1 ​

HMAC-SHA1はレガシー専用であり、まだ必要としているシステムとの互換性のために保持されています。

text
hmac_hex_sha1(message, key)
hmac_sha1(message, key)
パラメーター説明
message署名するデータ。
key共有シークレット。
HMAC-SHA1ダイジェストのバイト長を測定

次の例では、生のバイナリHMACダイジェストのバイト長を測定します。

Formula

text
byte_length(hmac_sha1('payload', 'secret'))

出力

text
20

hmac_hex_md5とhmac_md5 ​

HMAC-MD5はレガシー専用であり、まだ必要としているシステムとの互換性のために保持されています。

text
hmac_hex_md5(message, key)
hmac_md5(message, key)
パラメーター説明
message署名するデータ。
key共有シークレット。
HMAC-MD5ダイジェストのバイト長を測定

次の例では、生のバイナリHMACダイジェストのバイト長を測定します。

Formula

text
byte_length(hmac_md5('payload', 'secret'))

出力

text
16

ユースケース: インバウンドwebhook署名の検証 ​

プロバイダーは共有シークレットを使用して生の本文に署名し、その結果をヘッダーで送信します。 hmac_hex_sha256を使用して署名を再計算し、ヘッダーと比較します。

入力

json
{
  "body": "payload",
  "secret": "secret",
  "signature_header": "b82fcb791acec57859b989b430a826488ce2e479fdf92326bd0a2e8375a42ba4"
}

Formula

text
{
  expected: hmac_hex_sha256(_.body, _.secret),
  valid: hmac_hex_sha256(_.body, _.secret) == _.signature_header
}

出力

json
{
  "expected": "b82fcb791acec57859b989b430a826488ce2e479fdf92326bd0a2e8375a42ba4",
  "valid": true
}

受信したとおりの生の本文に署名します。 JSONを解析して再シリアル化すると、キーの順序や空白を含むバイトが変化します。何も問題がなくても、署名は一致しません。

JSON webトークン ​

WELはHMAC署名付きJWTをサポートしています: HS256、HS384、HS512。

jwt_encode ​

JWTを構築して署名します。

text
jwt_encode(payload, key, algorithm, options)
パラメーター説明
ペイロードクレームのMap。
key署名用シークレット。
algorithmHS256、HS384、またはHS512。大文字と小文字は区別されません。
options追加ヘッダーフィールドの任意のマップ。
HS256でJWTをエンコードして署名

次の例では、HS256でJWTを構築して署名します。

Formula

text
jwt_encode({sub: 'user-1'}, '0123456789abcdef0123456789abcdef', 'HS256')

出力

text
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyLTEifQ.FKuUN7RwYyegTHXiye1jBlIKzmjIfb39oxKzJk_Gmdo

HS256には少なくとも32バイトのキーが必要です

より短いキーでは、弱い素材で署名する代わりにE220が発生します。 HS384とHS512には、それぞれさらに長いキーが必要です。

この長さ要件が存在するのは、HMACの強度はキーの強度に依存し、短いキーでは署名が簡単に偽造されるためです。

jwt_decode ​

JWTをデコードし、その署名を検証します。署名が一致しないトークンは、その内容を返すのではなくエラーを発生させます。

text
jwt_decode(token, key, algorithm, options)
パラメーター説明
tokenエンコードされたJWT。
key検証に使用するシークレット。
algorithmHS256、HS384、またはHS512。
options検証設定の任意のマップ。
JWTをデコードして検証

次の例では、JWTをデコードしてその署名を検証します。

Formula

text
jwt_decode(jwt_encode({sub: 'user-1'}, '0123456789abcdef0123456789abcdef', 'HS256'), '0123456789abcdef0123456789abcdef', 'HS256')

出力

text
{header: {alg: "HS256", typ: "JWT"}, payload: {sub: "user-1"}}

JWTは署名されますが、シークレットではありません

トークンを保持している人は誰でもそのクレームを読み取ることができます。ペイロードはbase64エンコードされているだけです。署名は変更されていないことを証明するものであり、見られていないことを証明するものではありません。 JWTペイロードには機密情報を入れないでください。

jwt_algos ​

サポートされているJWT署名アルゴリズムを一覧表示します。

text
jwt_algos()
サポートされているJWTアルゴリズムを一覧表示

次の例では、サポートされているJWT署名アルゴリズムを一覧表示します。

Formula

text
jwt_algos()

出力

text
["HS256", "HS384", "HS512"]

キー導出 ​

キー導出は、パスワードを暗号化に適した暗号キーに変換します。

pbkdf2 ​

PBKDF2を使用してパスワードからキーを導出します。

反復回数を増やすとパスワード推測のコストが高くなるため、宛先システムで許可される最大値を使用します。固定のソルトを書き込むのではなく、random_bytesからソルトを取得します。

text
pbkdf2(password, salt, iterations, key_length, algorithm)
パラメーター説明
passwordパスワードまたはパスフレーズ。
salt一意のソルト。
iterationsラウンド数。
key_length導出されたキーの長さ(バイト単位)。
algorithm基礎となるハッシュ。たとえば、sha256。大文字と小文字は区別されません。
PBKDF2でパスワードからキーを導出

次の例では、パスワードからキーを導出し、16進テキストとして返します。デモ目的で1000回の反復を使用しています。プロダクション設定では、反復回数を大幅に増やす必要があります。

Formula

text
encode_hex_string(pbkdf2('password', 'salt', 1000, 16, 'sha256'))

出力

text
632c2812e46d4604102ba7618e9d6d7d

暗号化 ​

次の関数は、CBCモードのAESでデータを暗号化および復号化します。

aes_cbc_encrypt ​

PKCS7パディングを適用して、CBCモードのAESでデータを暗号化します。

text
aes_cbc_encrypt(data, key, iv)
パラメーター説明
data暗号化するデータ。
key暗号鍵。その長さによってAES-128、AES-192、またはAES-256が選択されます。
iv16バイトの初期化ベクトル。
AES-CBCでデータを暗号化

次の例では、AES-CBCでデータを暗号化し、暗号文をbase64としてレンダリングします。

Formula

text
encode_base64(aes_cbc_encrypt('secret data!!!!!', '0123456789abcdef', 'abcdef0123456789'))

出力

text
NsFUgzVrilJO5OF/imH/gbF6NPToZkf1hbVBJkaXXoY=

メッセージごとに新しい初期化ベクトル

同じキーでIVを再利用すると、平文に関する情報が漏えいします。メッセージごとにrandom_bytes(16)で生成し、暗号文と一緒に送信します。 IVは公開されたままでもかまいませんが、予測不可能かつ一意である必要があります。

CBCは認証を提供せず、暗号文の変更を検出できません。宛先システムが対応している場合は、認証付き暗号化モードを使用します。宛先でCBCが必要な場合は、暗号文とともにHMACを送信します。

aes_cbc_decrypt ​

AES-CBCデータを復号化し、PKCS7パディングを削除します。

text
aes_cbc_decrypt(data, key, iv)
パラメーター説明
data暗号文。
key暗号化に使用したものと同じキー。
iv暗号化に使用したものと同じ初期化ベクトル。
AES-CBC暗号文を復号化

次の例では、データを暗号化してから元のテキストに復号化します。

Formula

text
decode_string(aes_cbc_decrypt(aes_cbc_encrypt('secret data!!!!!', '0123456789abcdef', 'abcdef0123456789'), '0123456789abcdef', 'abcdef0123456789'), 'UTF-8')

出力

text
secret data!!!!!
  • バイナリ関数: encode_base64、encode_hex_string、およびbyte_lengthに関する詳細情報。
  • ランダム関数: ソルトと初期化ベクトル用にrandom_bytesを生成します。
  • エンコード関数: decode_stringを使用して、復号化されたバイトをテキストに戻します。
  • エラーコード: E220などのジョブ失敗をトラブルシューティングします。

最終更新日: