暗号化関数
暗号化関数は、インテグレーションで実際に必要な暗号技術を扱います。たとえば、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は新しい作業のデフォルトの選択肢です。
hex_sha256(value)
sha256(value)| パラメーター | 説明 |
|---|---|
| value | ハッシュ化するStringまたはBinary。 |
SHA-256で文字列をハッシュ化
次の例では、SHA-256で文字列をハッシュ化し、16進ダイジェストを返します。
Formula
hex_sha256('acme')出力
822b33ad87c148a0a20a5ba7cd5ebcaa68d36a18e7aad165554903f52ca82757生のSHA-256ダイジェストのバイト長を測定
次の例では、生のバイナリダイジェストのバイト長を測定します。
Formula
byte_length(sha256('acme'))出力
32hex_sha512とsha512
SHA-512は、同じファミリーからより長いダイジェストを生成します。
hex_sha512(value)
sha512(value)| パラメーター | 説明 |
|---|---|
| value | ハッシュ化するStringまたはBinary。 |
SHA-512ダイジェストのバイト長を測定
次の例では、生のバイナリダイジェストのバイト長を測定します。
Formula
byte_length(sha512('acme'))出力
64hex_sha512_256とsha512_256
SHA-512/256は256ビットのダイジェストを生成し、SHA-256の長さ拡張特性を回避します。
シークレットとメッセージをハッシュ化する場合に使用します。ただし、その場合はHMACの方がより直接的に処理でき、通常はより適した選択肢です。
hex_sha512_256(value)
sha512_256(value)| パラメーター | 説明 |
|---|---|
| value | ハッシュ化するStringまたはBinary。 |
SHA-512/256で文字列をハッシュ化
次の例では、SHA-512/256で文字列をハッシュ化し、16進ダイジェストを返します。
Formula
hex_sha512_256('acme')出力
2e7a8d79ac01f85db494bfddf90cc808d091543addc18bb68ad643257234735ahex_sha1とsha1
SHA-1はレガシー専用であり、まだ必要としているシステムとの互換性のために保持されています。
hex_sha1(value)
sha1(value)| パラメーター | 説明 |
|---|---|
| value | ハッシュ化するStringまたはBinary。 |
SHA-1で文字列をハッシュ化
次の例では、SHA-1で文字列をハッシュ化し、16進ダイジェストを返します。
Formula
hex_sha1('acme')出力
293abb6b76d7791c0732cc517d38c4b5c734b87fhex_md5とmd5
MD5はレガシー専用であり、敵対的でないチェックサムにのみ適しています。
hex_md5(value)
md5(value)| パラメーター | 説明 |
|---|---|
| value | ハッシュ化するStringまたはBinary。 |
MD5で文字列をハッシュ化
次の例では、MD5で文字列をハッシュ化し、16進ダイジェストを返します。
Formula
hex_md5('acme')出力
53bce4f1dfa0fe8e7ca126f91b35d3a6HMAC署名
HMACは、メッセージと共有シークレットを組み合わせて署名を生成します。 webhookプロバイダーは通常、信頼された送信者からリクエストが送信されたことを検証するためにHMAC署名を使用します。
すべてのHMAC関数は、メッセージを先に、キーを後に取ります。
hmac_hexとhmac
引数として指定されたアルゴリズムでHMACを計算します。
hmac_hex(message, key, algorithm)
hmac(message, key, algorithm)| パラメーター | 説明 |
|---|---|
| message | 署名するデータ。 |
| key | 共有シークレット。 |
| algorithm | sha256、sha384、sha512、またはレガシーのmd5とsha1。大文字と小文字は区別されません。 |
HMAC-SHA256署名を16進形式で計算
次の例では、HMAC-SHA256署名を計算し、16進文字列として返します。
Formula
hmac_hex('payload', 'secret', 'sha256')出力
b82fcb791acec57859b989b430a826488ce2e479fdf92326bd0a2e8375a42ba4生のHMACダイジェストのバイト長を測定
次の例では、生のバイナリHMACダイジェストのバイト長を測定します。
Formula
byte_length(hmac('payload', 'secret', 'sha256'))出力
32hmac_algos
サポートされているHMACアルゴリズムを一覧表示します。
hmac_algos()サポートされているHMACアルゴリズムを一覧表示
次の例では、サポートされているHMACアルゴリズムを一覧表示します。
Formula
hmac_algos()出力
["md5", "sha1", "sha256", "sha384", "sha512"]hmac_hex_sha256とhmac_sha256
ほとんどのwebhookプロバイダーはHMAC-SHA256を使用します。
hmac_hex_sha256(message, key)
hmac_sha256(message, key)| パラメーター | 説明 |
|---|---|
| message | 署名するデータ。 |
| key | 共有シークレット。 |
HMAC-SHA256署名を計算
次の例では、HMAC-SHA256署名を計算し、16進文字列として返します。
Formula
hmac_hex_sha256('payload', 'secret')出力
b82fcb791acec57859b989b430a826488ce2e479fdf92326bd0a2e8375a42ba4hmac_hex_sha384とhmac_sha384
HMAC-SHA384はHMAC-SHA256と同様に機能し、より長いダイジェストを使用します。
hmac_hex_sha384(message, key)
hmac_sha384(message, key)| パラメーター | 説明 |
|---|---|
| message | 署名するデータ。 |
| key | 共有シークレット。 |
HMAC-SHA384ダイジェストのバイト長を測定
次の例では、生のバイナリHMACダイジェストのバイト長を測定します。
Formula
byte_length(hmac_sha384('payload', 'secret'))出力
48hmac_hex_sha512とhmac_sha512
HMAC-SHA512はHMAC-SHA256と同様に機能し、HMAC-SHA384よりさらに長いダイジェストを使用します。
hmac_hex_sha512(message, key)
hmac_sha512(message, key)| パラメーター | 説明 |
|---|---|
| message | 署名するデータ。 |
| key | 共有シークレット。 |
HMAC-SHA512ダイジェストのバイト長を測定
次の例では、生のバイナリHMACダイジェストのバイト長を測定します。
Formula
byte_length(hmac_sha512('payload', 'secret'))出力
64hmac_hex_sha1とhmac_sha1
HMAC-SHA1はレガシー専用であり、まだ必要としているシステムとの互換性のために保持されています。
hmac_hex_sha1(message, key)
hmac_sha1(message, key)| パラメーター | 説明 |
|---|---|
| message | 署名するデータ。 |
| key | 共有シークレット。 |
HMAC-SHA1ダイジェストのバイト長を測定
次の例では、生のバイナリHMACダイジェストのバイト長を測定します。
Formula
byte_length(hmac_sha1('payload', 'secret'))出力
20hmac_hex_md5とhmac_md5
HMAC-MD5はレガシー専用であり、まだ必要としているシステムとの互換性のために保持されています。
hmac_hex_md5(message, key)
hmac_md5(message, key)| パラメーター | 説明 |
|---|---|
| message | 署名するデータ。 |
| key | 共有シークレット。 |
HMAC-MD5ダイジェストのバイト長を測定
次の例では、生のバイナリHMACダイジェストのバイト長を測定します。
Formula
byte_length(hmac_md5('payload', 'secret'))出力
16ユースケース: インバウンドwebhook署名の検証
プロバイダーは共有シークレットを使用して生の本文に署名し、その結果をヘッダーで送信します。 hmac_hex_sha256を使用して署名を再計算し、ヘッダーと比較します。
入力
{
"body": "payload",
"secret": "secret",
"signature_header": "b82fcb791acec57859b989b430a826488ce2e479fdf92326bd0a2e8375a42ba4"
}Formula
{
expected: hmac_hex_sha256(_.body, _.secret),
valid: hmac_hex_sha256(_.body, _.secret) == _.signature_header
}出力
{
"expected": "b82fcb791acec57859b989b430a826488ce2e479fdf92326bd0a2e8375a42ba4",
"valid": true
}受信したとおりの生の本文に署名します。 JSONを解析して再シリアル化すると、キーの順序や空白を含むバイトが変化します。何も問題がなくても、署名は一致しません。
JSON webトークン
WELはHMAC署名付きJWTをサポートしています: HS256、HS384、HS512。
jwt_encode
JWTを構築して署名します。
jwt_encode(payload, key, algorithm, options)| パラメーター | 説明 |
|---|---|
| ペイロード | クレームのMap。 |
| key | 署名用シークレット。 |
| algorithm | HS256、HS384、またはHS512。大文字と小文字は区別されません。 |
| options | 追加ヘッダーフィールドの任意のマップ。 |
HS256でJWTをエンコードして署名
次の例では、HS256でJWTを構築して署名します。
Formula
jwt_encode({sub: 'user-1'}, '0123456789abcdef0123456789abcdef', 'HS256')出力
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyLTEifQ.FKuUN7RwYyegTHXiye1jBlIKzmjIfb39oxKzJk_GmdoHS256には少なくとも32バイトのキーが必要です
より短いキーでは、弱い素材で署名する代わりにE220が発生します。 HS384とHS512には、それぞれさらに長いキーが必要です。
この長さ要件が存在するのは、HMACの強度はキーの強度に依存し、短いキーでは署名が簡単に偽造されるためです。
jwt_decode
JWTをデコードし、その署名を検証します。署名が一致しないトークンは、その内容を返すのではなくエラーを発生させます。
jwt_decode(token, key, algorithm, options)| パラメーター | 説明 |
|---|---|
| token | エンコードされたJWT。 |
| key | 検証に使用するシークレット。 |
| algorithm | HS256、HS384、またはHS512。 |
| options | 検証設定の任意のマップ。 |
JWTをデコードして検証
次の例では、JWTをデコードしてその署名を検証します。
Formula
jwt_decode(jwt_encode({sub: 'user-1'}, '0123456789abcdef0123456789abcdef', 'HS256'), '0123456789abcdef0123456789abcdef', 'HS256')出力
{header: {alg: "HS256", typ: "JWT"}, payload: {sub: "user-1"}}JWTは署名されますが、シークレットではありません
トークンを保持している人は誰でもそのクレームを読み取ることができます。ペイロードはbase64エンコードされているだけです。署名は変更されていないことを証明するものであり、見られていないことを証明するものではありません。 JWTペイロードには機密情報を入れないでください。
jwt_algos
サポートされているJWT署名アルゴリズムを一覧表示します。
jwt_algos()サポートされているJWTアルゴリズムを一覧表示
次の例では、サポートされているJWT署名アルゴリズムを一覧表示します。
Formula
jwt_algos()出力
["HS256", "HS384", "HS512"]キー導出
キー導出は、パスワードを暗号化に適した暗号キーに変換します。
pbkdf2
PBKDF2を使用してパスワードからキーを導出します。
反復回数を増やすとパスワード推測のコストが高くなるため、宛先システムで許可される最大値を使用します。固定のソルトを書き込むのではなく、random_bytesからソルトを取得します。
pbkdf2(password, salt, iterations, key_length, algorithm)| パラメーター | 説明 |
|---|---|
| password | パスワードまたはパスフレーズ。 |
| salt | 一意のソルト。 |
| iterations | ラウンド数。 |
| key_length | 導出されたキーの長さ(バイト単位)。 |
| algorithm | 基礎となるハッシュ。たとえば、sha256。大文字と小文字は区別されません。 |
PBKDF2でパスワードからキーを導出
次の例では、パスワードからキーを導出し、16進テキストとして返します。デモ目的で1000回の反復を使用しています。プロダクション設定では、反復回数を大幅に増やす必要があります。
Formula
encode_hex_string(pbkdf2('password', 'salt', 1000, 16, 'sha256'))出力
632c2812e46d4604102ba7618e9d6d7d暗号化
次の関数は、CBCモードのAESでデータを暗号化および復号化します。
aes_cbc_encrypt
PKCS7パディングを適用して、CBCモードのAESでデータを暗号化します。
aes_cbc_encrypt(data, key, iv)| パラメーター | 説明 |
|---|---|
| data | 暗号化するデータ。 |
| key | 暗号鍵。その長さによってAES-128、AES-192、またはAES-256が選択されます。 |
| iv | 16バイトの初期化ベクトル。 |
AES-CBCでデータを暗号化
次の例では、AES-CBCでデータを暗号化し、暗号文をbase64としてレンダリングします。
Formula
encode_base64(aes_cbc_encrypt('secret data!!!!!', '0123456789abcdef', 'abcdef0123456789'))出力
NsFUgzVrilJO5OF/imH/gbF6NPToZkf1hbVBJkaXXoY=メッセージごとに新しい初期化ベクトル
同じキーでIVを再利用すると、平文に関する情報が漏えいします。メッセージごとにrandom_bytes(16)で生成し、暗号文と一緒に送信します。 IVは公開されたままでもかまいませんが、予測不可能かつ一意である必要があります。
CBCは認証を提供せず、暗号文の変更を検出できません。宛先システムが対応している場合は、認証付き暗号化モードを使用します。宛先でCBCが必要な場合は、暗号文とともにHMACを送信します。
aes_cbc_decrypt
AES-CBCデータを復号化し、PKCS7パディングを削除します。
aes_cbc_decrypt(data, key, iv)| パラメーター | 説明 |
|---|---|
| data | 暗号文。 |
| key | 暗号化に使用したものと同じキー。 |
| iv | 暗号化に使用したものと同じ初期化ベクトル。 |
AES-CBC暗号文を復号化
次の例では、データを暗号化してから元のテキストに復号化します。
Formula
decode_string(aes_cbc_decrypt(aes_cbc_encrypt('secret data!!!!!', '0123456789abcdef', 'abcdef0123456789'), '0123456789abcdef', 'abcdef0123456789'), 'UTF-8')出力
secret data!!!!!関連情報
最終更新日: