passlib.hash.bigcrypt
- BigCrypt¶
Danger
This algorithm is dangerously insecure by modern standards. It is trivially broken, and should not be used if at all possible. For new code, see the list of recommended hashes.
This class implements BigCrypt (a modified version of DES-Crypt) commonly
found on HP-UX, Digital Unix, and OSF/1. The main difference between it and
des_crypt
is that BigCrypt
uses all the characters of a password, not just the first 8,
and has a variable length hash.
See also
password hash usage – for examples of how to use this class via the common hash interface.
Interface¶
-
class
passlib.hash.
bigcrypt
¶ This class implements the BigCrypt password hash, and follows the PasswordHash API.
It supports a fixed-length salt.
The
using()
method accepts the following optional keywords:Parameters: - salt (str) – Optional salt string.
If not specified, one will be autogenerated (this is recommended).
If specified, it must be 22 characters, drawn from the regexp range
[./0-9A-Za-z]
. - relaxed (bool) –
By default, providing an invalid value for one of the other keywords will result in a
ValueError
. Ifrelaxed=True
, and the error can be corrected, aPasslibHashWarning
will be issued instead. Correctable errors includesalt
strings that are too long.New in version 1.6.
- salt (str) – Optional salt string.
If not specified, one will be autogenerated (this is recommended).
If specified, it must be 22 characters, drawn from the regexp range
Format¶
An example hash (of the string passphrase
) is S/8NbAAlzbYO66hAa9XZyWy2
.
A bigcrypt hash string has the format saltchecksum_1checksum_2...checksum_n
for some integer n>0
, where:
salt
is the salt, stored as a 2 characterhash64
-encoded 12-bit integer (S/
in the example).- each
checksum_i
is a separate checksum, stored as an 11 characterhash64-big
-encoded 64-bit integer (8NbAAlzbYO6
and6hAa9XZyWy2
in the example). - the integer
n
(the number of checksums) is determined by the formulan=min(1, (len(secret)+7)//8)
.
Note
This hash format lacks any magic prefix that can be used to unambiguously
identify it. Out of context, certain bigcrypt
hashes may
be confused with that of two other algorithms:
Algorithm¶
Security Issues¶
BigCrypt is dangerously flawed:
- It suffers from all the flaws of
des_crypt
. - Since each checksum component in its hash is essentially a separate des-crypt checksum, they can be attacked in parallel.
- It reveals information about the length of the encoded password (to within 8 characters), further reducing the keyspace that needs to be searched for each of the individual segments.
- The last checksum typically contains only a few characters of the passphrase, and once cracked, can be used to narrow the overall keyspace.
Deviations¶
This implementation of bigcrypt differs from others in two ways:
Maximum Password Size:
This implementation currently accepts arbitrarily large passwords, producing arbitrarily large hashes. Other implementation have various limits on maximum password length (commonly, 128 chars), and discard the remaining part of the password.
Thus, while Passlib should be able to verify all existing bigcrypt hashes, other systems may require hashes generated by Passlib to be truncated to their specific maximum length.
Unicode Policy:
The original bigcrypt algorithm was designed for 7-bit
us-ascii
encoding only (as evidenced by the fact that it discards the 8th bit of all password bytes).In order to provide support for unicode strings, Passlib will encode unicode passwords using
utf-8
before running them through bigcrypt. If a different encoding is desired by an application, the password should be encoded before handing it to Passlib.
Footnotes
[1] | discussion of bigcrypt & crypt16 - http://www.mail-archive.com/exim-dev@exim.org/msg00970.html |