Skip to main content

HMAC-based webhook signature generation and verification with timing-safe comparison

Project description

philiprehberger-webhook-signature

Tests PyPI version GitHub release Last updated License Bug Reports Feature Requests Sponsor

HMAC-based webhook signature generation and verification with timing-safe comparison.

Installation

pip install philiprehberger-webhook-signature

Usage

Signing a Payload

from philiprehberger_webhook_signature import sign

signed = sign(payload='{"event": "order.created"}', secret="whsec_abc123")

print(signed.signature)   # HMAC hex digest
print(signed.timestamp)   # Unix timestamp
print(signed.to_header()) # "t=1234567890,sha256=abc..."

Verifying a Signature

from philiprehberger_webhook_signature import verify, parse_header

# Parse the signature header
header = request.headers["X-Webhook-Signature"]
signature, timestamp = parse_header(header)

# Verify (raises on failure)
verify(
    payload=request.body,
    secret="whsec_abc123",
    signature=signature,
    timestamp=timestamp,
    max_age=300.0,  # reject signatures older than 5 minutes
)

Key Rotation

Use verify_with_rotation for zero-downtime secret rotation. It tries the current secret first and falls back to the previous secret if verification fails:

from philiprehberger_webhook_signature import verify_with_rotation, parse_header

header = request.headers["X-Webhook-Signature"]
signature, timestamp = parse_header(header)

verify_with_rotation(
    payload=request.body,
    signature=signature,
    current_secret="whsec_new_secret",
    previous_secret="whsec_old_secret",  # optional fallback
    tolerance=300,
    timestamp=timestamp,
)

Error Handling

from philiprehberger_webhook_signature import (
    verify,
    SignatureError,
    SignatureExpiredError,
    SignatureMismatchError,
)

try:
    verify(payload, secret, signature, timestamp)
except SignatureExpiredError as e:
    print(f"Signature too old: {e.age}s > {e.max_age}s")
except SignatureMismatchError:
    print("Invalid signature")
except SignatureError as e:
    print(f"Verification failed: {e}")

Custom Algorithm

signed = sign(payload="data", secret="secret", algorithm="sha512")
verify(payload="data", secret="secret", signature=sig, timestamp=ts, algorithm="sha512")

Disable Expiry Check

verify(payload, secret, signature, timestamp, max_age=None)

API

Function / Class Description
sign(payload, secret, algorithm, timestamp) Generate an HMAC signature for a webhook payload
verify(payload, secret, signature, timestamp, algorithm, max_age) Verify a webhook signature with timing-safe comparison
verify_with_rotation(payload, signature, current_secret, previous_secret, tolerance, algorithm, timestamp) Verify with key rotation support (tries current then previous secret)
parse_header(header, prefix) Parse a signature header string into (signature, timestamp) tuple
SignedPayload Signed payload with signature, timestamp, body, and to_header()
SignatureError Base exception for signature errors
SignatureExpiredError Raised when signature age exceeds max_age
SignatureMismatchError Raised when signature verification fails

Development

pip install -e .
python -m pytest tests/ -v

Support

If you find this package useful, consider giving it a star on GitHub — it helps motivate continued maintenance and development.

LinkedIn More packages

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

philiprehberger_webhook_signature-0.2.0.tar.gz (6.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

File details

Details for the file philiprehberger_webhook_signature-0.2.0.tar.gz.

File metadata

File hashes

Hashes for philiprehberger_webhook_signature-0.2.0.tar.gz
Algorithm Hash digest
SHA256 9d12556211c4fd659219e7d19b94432640b793eb94cdbcf48687e8d0a5dca369
MD5 965d914a913b87ca6b034d40c260b71b
BLAKE2b-256 40b9e345d03361907cdc69c51ba75ca086ec615d9093057ab83f0a18ece2a27e

See more details on using hashes here.

File details

Details for the file philiprehberger_webhook_signature-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for philiprehberger_webhook_signature-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ecaaf5f428f6b551358055b6b3e39c2bdf8c45dd93bacf87e59b04f57ce94464
MD5 7d4038afb10a7667c9f9ffe43898c7f2
BLAKE2b-256 cf364521e75fa20b1a8f3ab5cd3462d6b5fcfd6aafa6b5a01d5933e45b40c7a7

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page