Skip to main content

Pwned Passwords check (offline)

Project description

Pwned Passwords check (offline)

PyPI Code style: black

Features

  • Check passwords or plain SHA-1 hashes against haveibeenpwned password list
  • Fully offline operation, needs to be provided with external database file (~35 GB)
  • Optional Bloom filter to speed up common (negative) case

Quickstart

  • Download "SHA-1" version "(ordered by hash)" from https://haveibeenpwned.com/Passwords
  • Extract file, yielding pwned-passwords-sha1-ordered-by-hash-v8.txt (for current version 8), put into data directory under current directory
  • Install with pip install pwnedpasswords_offline
  • Optional: Seed Bloom filter: pwnedpasswords_offline_seed_bloom, takes about 45min to run, will generate a 512MiB file

Speed

(Results approximate, measured on my personal laptop)

w/o Bloom filter w/ Bloom filter
Positive match (pwned) 61 us/op 198 us/op
Negative match 121 us/op 14 us/op
Average @ 1% positive 64 us/op 16 us/op

These results were measured with batch operation at 20000 items. One-shot operation will be much slower due to the overhead of opening data files.

The data files are opened with mmap(2), and accessed in random order. No explicit non-garbage-collected Python objects are generated during operation, so it should be safe to open the data files once at the start of your application and then keep them open until your process ends. Note: The memory mapping will not survive a fork(2), so you cannot use a pre-forking webserver such as gunicorn to only open the data files once. Each process needs to open its own copy.

Simple usage

from pwnedpasswords_offline import PwnedPasswordsOfflineChecker
if PwnedPasswordsOfflineChecker("data/pwned-passwords-sha1-ordered-by-hash-v8.txt").lookup_raw_password("Password1!"):
    print("Pwned!")

Batch usage

You can also pre-open the database file, especially if you're checking multiple passwords in bulk:

from pwnedpasswords_offline import PwnedPasswordsOfflineChecker
checker = PwnedPasswordsOfflineChecker("data/pwned-passwords-sha1-ordered-by-hash-v8.txt")
checker.open()
for password in ["Password1!", "correct horse battery staple", "actress stapling driver placidly swivel doorknob"]:
    if checker.lookup_raw_password(password):
        print(f"'{password}' is pwned!")
checker.close()

You should not forget to call .close() after you're done.

As context manager

You can use the object as a context manager to automatically open and close it:

from pwnedpasswords_offline import PwnedPasswordsOfflineChecker
with PwnedPasswordsOfflineChecker("data/pwned-passwords-sha1-ordered-by-hash-v8.txt") as checker:
    for password in ["Password1!", "correct horse battery staple", "actress stapling driver placidly swivel doorknob"]:
        if checker.lookup_raw_password(password):
            print(f"'{password}' is pwned!")

Check hash directly

Instead of calling .lookup_raw_password() you can call .lookup_hash() if you already have the plain SHA-1 hash:

from pwnedpasswords_offline import PwnedPasswordsOfflineChecker
if PwnedPasswordsOfflineChecker("data/pwned-passwords-sha1-ordered-by-hash-v8.txt").lookup_hash("32CA9FD4B3F319419F2EA6F883BF45686089498D"):
    print("Pwned!")

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

pwnedpasswords-offline-1.2.0.tar.gz (17.0 kB view details)

Uploaded Source

Built Distribution

pwnedpasswords_offline-1.2.0-py3-none-any.whl (27.5 kB view details)

Uploaded Python 3

File details

Details for the file pwnedpasswords-offline-1.2.0.tar.gz.

File metadata

  • Download URL: pwnedpasswords-offline-1.2.0.tar.gz
  • Upload date:
  • Size: 17.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.1 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.10

File hashes

Hashes for pwnedpasswords-offline-1.2.0.tar.gz
Algorithm Hash digest
SHA256 fa63ba0a8982a566512aea02b56dd55bb94d8440cab1ce00112728951a7633e4
MD5 30616466407e5421f2e471f07f0151b5
BLAKE2b-256 7017b8171f37952180779ba840491e85b015e788d0a35d2dd09af6676711667b

See more details on using hashes here.

File details

Details for the file pwnedpasswords_offline-1.2.0-py3-none-any.whl.

File metadata

  • Download URL: pwnedpasswords_offline-1.2.0-py3-none-any.whl
  • Upload date:
  • Size: 27.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.1 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.10

File hashes

Hashes for pwnedpasswords_offline-1.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 177013e60d26aa7ebd465b949a47073113ea1116112428092b1a433d4e963f9d
MD5 b9e18b58403cfa9e6ea68d1615f1595c
BLAKE2b-256 53f2c3289938d16843b688a7adb0937a4886a8f385782abe7a3fed2fb0701471

See more details on using hashes here.

Supported by

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