blob: 1ba2ed3427011e5cc245888693bab10128e1773d [file] [log] [blame]
Georg Brandl116aa622007-08-15 14:28:22 +00001:mod:`crypt` --- Function to check Unix passwords
2=================================================
3
4.. module:: crypt
5 :platform: Unix
6 :synopsis: The crypt() function used to check Unix passwords.
7.. moduleauthor:: Steven D. Majewski <sdm7g@virginia.edu>
8.. sectionauthor:: Steven D. Majewski <sdm7g@virginia.edu>
9.. sectionauthor:: Peter Funk <pf@artcom-gmbh.de>
10
11
12.. index::
13 single: crypt(3)
14 pair: cipher; DES
15
16This module implements an interface to the :manpage:`crypt(3)` routine, which is
17a one-way hash function based upon a modified DES algorithm; see the Unix man
Sean Reifscheidere2dfefb2011-02-22 10:55:44 +000018page for further details. Possible uses include storing hashed passwords
19so you can check passwords without storing the actual password, or attempting
20to crack Unix passwords with a dictionary.
Georg Brandl116aa622007-08-15 14:28:22 +000021
22.. index:: single: crypt(3)
23
24Notice that the behavior of this module depends on the actual implementation of
25the :manpage:`crypt(3)` routine in the running system. Therefore, any
26extensions available on the current implementation will also be available on
27this module.
28
Sean Reifscheidere2dfefb2011-02-22 10:55:44 +000029Hashing Methods
30---------------
Georg Brandl116aa622007-08-15 14:28:22 +000031
Éric Araujof2156312011-05-29 03:27:48 +020032.. versionadded:: 3.3
33
Sean Reifscheidere2dfefb2011-02-22 10:55:44 +000034The :mod:`crypt` module defines the list of hashing methods (not all methods
35are available on all platforms):
36
37.. data:: METHOD_SHA512
38
39 A Modular Crypt Format method with 16 character salt and 86 character
40 hash. This is the strongest method.
41
Sean Reifscheidere2dfefb2011-02-22 10:55:44 +000042.. data:: METHOD_SHA256
43
44 Another Modular Crypt Format method with 16 character salt and 43
45 character hash.
46
Sean Reifscheidere2dfefb2011-02-22 10:55:44 +000047.. data:: METHOD_MD5
48
49 Another Modular Crypt Format method with 8 character salt and 22
50 character hash.
51
Sean Reifscheidere2dfefb2011-02-22 10:55:44 +000052.. data:: METHOD_CRYPT
53
54 The traditional method with a 2 character salt and 13 characters of
55 hash. This is the weakest method.
56
Brett Cannondaa57992011-02-22 21:48:06 +000057
58Module Attributes
59-----------------
60
Éric Araujof2156312011-05-29 03:27:48 +020061.. versionadded:: 3.3
Brett Cannondaa57992011-02-22 21:48:06 +000062
63.. attribute:: methods
64
65 A list of available password hashing algorithms, as
66 ``crypt.METHOD_*`` objects. This list is sorted from strongest to
67 weakest, and is guaranteed to have at least ``crypt.METHOD_CRYPT``.
68
Brett Cannondaa57992011-02-22 21:48:06 +000069
Sean Reifscheidere2dfefb2011-02-22 10:55:44 +000070Module Functions
71----------------
72
73The :mod:`crypt` module defines the following functions:
74
75.. function:: crypt(word, salt=None)
Georg Brandl116aa622007-08-15 14:28:22 +000076
77 *word* will usually be a user's password as typed at a prompt or in a graphical
Sean Reifscheidere2dfefb2011-02-22 10:55:44 +000078 interface. The optional *salt* is either a string as returned from
79 :func:`mksalt`, one of the ``crypt.METHOD_*`` values (though not all
80 may be available on all platforms), or a full encrypted password
81 including salt, as returned by this function. If *salt* is not
82 provided, the strongest method will be used (as returned by
83 :func:`methods`.
84
85 Checking a password is usually done by passing the plain-text password
86 as *word* and the full results of a previous :func:`crypt` call,
87 which should be the same as the results of this call.
88
89 *salt* (either a random 2 or 16 character string, possibly prefixed with
90 ``$digit$`` to indicate the method) which will be used to perturb the
91 encryption algorithm. The characters in *salt* must be in the set
92 ``[./a-zA-Z0-9]``, with the exception of Modular Crypt Format which
93 prefixes a ``$digit$``.
94
95 Returns the hashed password as a string, which will be composed of
96 characters from the same alphabet as the salt.
Georg Brandl116aa622007-08-15 14:28:22 +000097
98 .. index:: single: crypt(3)
99
100 Since a few :manpage:`crypt(3)` extensions allow different values, with
101 different sizes in the *salt*, it is recommended to use the full crypted
102 password as salt when checking for a password.
103
Éric Araujof2156312011-05-29 03:27:48 +0200104 .. versionchanged:: 3.3
105 Accept ``crypt.METHOD_*`` values in addition to strings for *salt*.
Sean Reifscheidere2dfefb2011-02-22 10:55:44 +0000106
Sean Reifscheidere2dfefb2011-02-22 10:55:44 +0000107
108.. function:: mksalt(method=None)
109
110 Return a randomly generated salt of the specified method. If no
111 *method* is given, the strongest method available as returned by
112 :func:`methods` is used.
113
114 The return value is a string either of 2 characters in length for
115 ``crypt.METHOD_CRYPT``, or 19 characters starting with ``$digit$`` and
116 16 random characters from the set ``[./a-zA-Z0-9]``, suitable for
117 passing as the *salt* argument to :func:`crypt`.
118
Éric Araujof2156312011-05-29 03:27:48 +0200119 .. versionadded:: 3.3
Sean Reifscheidere2dfefb2011-02-22 10:55:44 +0000120
121Examples
122--------
123
Georg Brandl116aa622007-08-15 14:28:22 +0000124A simple example illustrating typical use::
125
Éric Araujobc577892011-05-29 03:24:45 +0200126 import pwd
127 import crypt
128 import getpass
Georg Brandl116aa622007-08-15 14:28:22 +0000129
Georg Brandl116aa622007-08-15 14:28:22 +0000130 def login():
Éric Araujobc577892011-05-29 03:24:45 +0200131 username = input('Python login: ')
Georg Brandl116aa622007-08-15 14:28:22 +0000132 cryptedpasswd = pwd.getpwnam(username)[1]
133 if cryptedpasswd:
Georg Brandl48310cd2009-01-03 21:18:54 +0000134 if cryptedpasswd == 'x' or cryptedpasswd == '*':
Éric Araujobc577892011-05-29 03:24:45 +0200135 raise ValueError('no support for shadow passwords')
Georg Brandl116aa622007-08-15 14:28:22 +0000136 cleartext = getpass.getpass()
137 return crypt.crypt(cleartext, cryptedpasswd) == cryptedpasswd
138 else:
Éric Araujobc577892011-05-29 03:24:45 +0200139 return True
Georg Brandl116aa622007-08-15 14:28:22 +0000140
Sean Reifscheidere2dfefb2011-02-22 10:55:44 +0000141To generate a hash of a password using the strongest available method and
142check it against the original::
143
144 import crypt
145
146 hashed = crypt.crypt(plaintext)
147 if hashed != crypt.crypt(plaintext, hashed):
Éric Araujobc577892011-05-29 03:24:45 +0200148 raise ValueError("hashed version doesn't validate against original")