Skip to main content

pbkdf2-pure

Zero-dependency pure-stdlib PBKDF2 — bit-for-bit implementation of RFC 8018 §5.2, verified against every RFC 6070 canonical test vector, drop-in compatible with hashlib.pbkdf2_hmac.

Why

hashlib.pbkdf2_hmac is C-backed (OpenSSL) — it is unavailable in environments without OpenSSL: serverless cold starts, MicroPython, Pyodide, embedded Python, audit-only containers. This package provides the same signature and behavior using only hmac, hashlib, and struct from the Python standard library.

Install

pip install -e .

No runtime dependencies.

Quickstart

from pbkdf2_pure import pbkdf2_hmac

# Drop-in compatible with hashlib.pbkdf2_hmac
dk = pbkdf2_hmac("sha1", "password", "salt", 100000, 32)
print(dk.hex())

Supported hash names: sha1, sha256, sha512. Both bytes and str are accepted for password and salt (str is UTF-8 encoded — matches hashlib behavior).

RFC 6070 Test Vectors

Five vectors are validated on every test run:

Vector c dkLen Hash Status
V1 1 20 sha1 always-on
V2 2 20 sha1 always-on
V3 4,096 20 sha1 always-on
V4 16,777,216 20 sha1 gated (PBKDF2_RUN_SLOW_TESTS=1)
V5 4,096 25 sha1 always-on (long passphrase)
V6 4,096 16 sha1 always-on (embedded NUL)

Vector 4 takes ~30 minutes in pure Python — gated behind the env var to keep CI under 1 second.

Run tests

pip install -e ".[test]"   # if a [test] extra is configured; otherwise just pytest
pytest -q

With V4 enabled:

PBKDF2_RUN_SLOW_TESTS=1 pytest -q

Limitations

  • Speed. Pure-Python PBKDF2 is roughly 100× slower than hashlib.pbkdf2_hmac for high iteration counts. Do not use this package for production password hashing at high c — use hashlib.pbkdf2_hmac or argon2 instead. This package is for constrained environments where C extensions are not available, and for verification/reference use.
  • Hash coverage. Only sha1, sha256, sha512 are supported. Other hashes (blake2, sha3, md5) are intentionally not exposed — they are not the primary PBKDF2 targets and including them would expand the surface area beyond RFC 8018's intent.
  • Algorithm. This is a canonical port of RFC 8018 §5.2 — it is not a novel algorithm or an improvement. The pseudocode structure (D / T / U_1..U_c / XOR / first dkLen octets) is preserved verbatim.

Known Issues

This library has passed audit-grade fuzzing (4,588 iterations across 5 Hypothesis surfaces, 109 oracle cross-checks vs hashlib.pbkdf2_hmac, 0 crashes, 0 Critical, 0 High) and is safe to ship as v0.1.0 per the HIGHEST_QUALITY_REPO contract. The following findings are documented for transparency and will be addressed in v1.0:

ID Severity CWE Description
F-001 Info CWE-20 (mitigated) hash_name whitelist enforced; 0 unexpected exceptions across all probed strings
F-002 Info CWE-20 (mitigated) str→UTF-8 coercion is byte-identical to hashlib across non-ASCII inputs
F-003 Info CWE-20 (mitigated) dklen gates reject bool/float/None/str/bytes/bytearray; accept positive int; short-circuit dklen=0
F-004 Info CWE-20 (mitigated) byte-for-byte equality vs hashlib.pbkdf2_hmac across 109 random vectors (60 manual + 49 fuzz)
F-005 Info CWE-20 (mitigated) iterations int gate rejects non-int; accepts positive int; rejects iterations<1
F-006 Medium CWE-1284 iterations=True silently coerced to 1 (bool is subclass of int in Python; True < 1 is False); fuzzer pre-filtered bool inputs — static finding only. P1 advisory for v1.0: add isinstance(iterations, bool) guard.
F-007 Low CWE-400 No upper bound on iterations; iterations=10**18 would loop indefinitely (user-DOS, not remote exploit). P2 advisory for v1.0: document NIST SP 800-132 ≥1000 / OWASP ≥600,000 guidance.
F-008 Low CWE-770 No upper bound on dklen; dklen=10**10 would attempt 10 GB allocation. P2 advisory for v1.0: document typical dklen is 16–64 bytes.
F-009 Info CWE-326 SHA-1 remains in supported hashes per RFC 8018 §5.2 compatibility; no runtime warning when SHA-1 is selected. P2 advisory for v1.0: emit UserWarning for hash_name=='sha1'.
F-010 Info CWE-327 (mitigated) HMAC defeats length-extension attacks by construction; no intermediate HMAC state is exposed
F-011 Info CWE-20 (mitigated) password/salt str→UTF-8 coercion matches hashlib.pbkdf2_hmac byte-for-byte

Severity rollup: 0 Critical / 0 High / 1 Medium (static-only, P1 advisory for v1.0) / 2 Low (advisory) / 8 Info

Fuzzing verdict: SHIP — FUZZING_REPORT.md §6 Verdict rationale: 0 Critical + 0 High findings allows advance to ship per HIGHEST_QUALITY_REPO contract line 316. The Medium finding (F-006) was NOT exercised by the fuzzer (harness pre-filtered bool inputs) and is documented as a P1 advisory for v1.0, not a v0.1.0 blocker.

References

  1. RFC 8018 — PKCS #5: Password-Based Cryptography Specification Version 2.1 (Section 5.2: PBKDF2)
  2. RFC 6070 — PBKDF2 Test Vectors
  3. Python hashlib.pbkdf2_hmac documentation

License

MIT.

Download files

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

Source Distribution

pbkdf2_pure-0.1.0.tar.gz (7.2 kB view details)

Uploaded Source

Built Distribution

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

pbkdf2_pure-0.1.0-py3-none-any.whl (5.6 kB view details)

Uploaded Python 3

File details

Details for the file pbkdf2_pure-0.1.0.tar.gz.

File metadata

  • Download URL: pbkdf2_pure-0.1.0.tar.gz
  • Upload date:
  • Size: 7.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.11.15

File hashes

Hashes for pbkdf2_pure-0.1.0.tar.gz
Algorithm Hash digest
SHA256 eedcf4b9de628b033c77e49e8751932c8dfafcdbea646f9dd7c8e2bf5d7ca255
MD5 f3be17ed3b56bf633979db17844fd5da
BLAKE2b-256 38170a1cec64583be132edf7a4ebceeb0b5623144aaebb7241c01a68b5615bcf

See more details on using hashes here.

File details

Details for the file pbkdf2_pure-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: pbkdf2_pure-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 5.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.11.15

File hashes

Hashes for pbkdf2_pure-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1c41ff9d0a92ea9bd28f1950daefbe49d91376473e8d526f0a14f66a8af96204
MD5 ac960b52890b498ba009b34c2c73a076
BLAKE2b-256 c9e729d719acf8ef8aa0ff6e5f1002422835d7a6d1bd807bf66b1bd4c0be5d49

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page