ZTXBAS API の HMAC リクエスト署名
すべての /v1/* リクエストはアプリケーションのシークレットを用いた HMAC-SHA256 で署名します。SDK はこの処理を代行します。手動で署名する場合や別言語で実装する場合に参照してください。
4 つのヘッダー
| ヘッダー | 値 |
|---|---|
X-Application-ID | ztxbas app create で発行されたアプリケーション ID |
X-Timestamp | Unix 時刻(秒)。サーバー時刻の ±300 秒以内 |
X-Nonce | リクエストごとのランダム文字列。32 桁の 16 進文字列でも可 |
X-Signature | hex(HMAC-SHA256(secret, canonical)) |
正規化形式
正規化文字列は 1 行で、末尾に改行を付けません。
METHOD:GET、POST、DELETE等の大文字の HTTP メソッド。PATH:先頭が/の正確な URL パス。クエリ文字列は含みません。TIMESTAMP:X-Timestampと同じ値。NONCE:X-Nonceと同じ値。BODY:送信する本文の生バイト列。本文のない GET/DELETE は空文字列です。署名後に JSON を整形し直してはいけません。
METHOD "|" PATH "|" TIMESTAMP "|" NONCE "|" BODY
実例
{"email":"alice@example.com"} を本文とする POST /v1/users の署名例です。SDK はこの既知のテストベクターを使って検証されています。新しい言語で署名を実装する場合にも同じ値で検証してください。
canonical = 'POST|/v1/users|1704067200|abc123|{"email":"alice@example.com"}'
signature = hex(HMAC-SHA256("topsecret", canonical))
= 92c2aca00ba47b4377aebf3e3af134aff93cf7ad959d05e31a0f0618df9f7d9a
POST /v1/users HTTP/1.1
Host: ztxbas.example.com
X-Application-ID: app_test
X-Timestamp: 1704067200
X-Nonce: abc123
X-Signature: 92c2aca00ba47b4377aebf3e3af134aff93cf7ad959d05e31a0f0618df9f7d9a
Content-Type: application/json
{"email":"alice@example.com"}
セキュリティ上の注意
- シークレットは秘密鍵と同等に保護し、ファイル権限を
0600に設定します。 - 独自の検証実装では定数時間比較を使用します。サーバーは Go の
crypto/subtle.ConstantTimeCompareを使用します。 - 本文上限は 8 KiB。超過すると 413
BODY_TOO_LARGEが返ります。 - 時刻ずれ許容は ±300 秒。
TIMESTAMP_EXPIREDが発生する場合は NTP を確認します。 - v1 ではノンスの再利用をサーバー側で強制的に拒否しません。 リプレイ境界はタイムスタンプの許容範囲です。それでも毎回新しいランダムノンスを生成してください。