Passlib 1.8




1.8 is under development, and tenatively scheduled for release in late 2017.

See for the latest release.


  • Passlib now requires Python >= 3.5. As of this release, support for Python 2.x, 3.3, and 3.4 has been dropped. If you need to use Passlib on an earlier version of Python, please use the Passlib 1.7 series, which will be maintained in bugfix-only mode for few more releases. (See issue 119 for rationale).

Backwards Incompatibilities

The following previously-deprecated features were removed, though few of these should be in use, as they’ve been deprecated for a number of years / releases:


  • passlib.apache: A number of deprecated options & methods were removed from HtpasswdFile and Htdigest:
    • Support for setting encoding=None removed, use return_unicode=True instead.
    • autoload=False keyword removed, use new=True instead.
    • load() method no longer supports force=False, use load_if_changed() instead.
    • update() alias removed, use set_password() instead.
    • find() alias removed, use get_hash() instead.
    • verify() alias removed, use check_password() instead.
    • default keyword removed, use default_scheme instead.


  • The passlib.context.CryptPolicy class was removed. Code should be using the equivalent CryptContext() methods instead.
  • Concurrent with that, CryptContext’s policy keyword and attribute were removed, along with LazyCryptContext’s create_policy keyword.
  • CryptContext.replace() alias removed, use CryptContext.using() instead.
  • CryptContext’s min_verify_time and harden_verify keywords removed.


  • passlib.hash.unix_fallback was removed, use unix_disabled instead.

other modules:

internal details:

  • The passlib.hash.nthash.raw_nthash() alias was removed, use nthash.raw() instead.
  • In passlib.utils.handlers: StaticHandler subclasses must now always implement _calc_checksum(), the old genhash-based style is no longer supported or checked for.
  • The deprecated passlib.utils.des.mdes_encrypt_int_block() method was removed.
  • The passlib.utils.pbkdf2.norm_hash_name() alias was removed, use passlib.crypto.digest.norm_hash_name() instead.
  • Many PY2 compatibility helper inside passlib.utils.compat have been removed.