annotate Lib/crypt.py @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents e8a314fe248b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
68105
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
1 """Wrapper to the POSIX crypt library call and associated functionality."""
68097
372b2ef0ff37 Issue #10924: Adding salt and Modular Crypt Format to crypt library.
Sean Reifscheider <jafo@tummy.com>
parents:
diff changeset
2
372b2ef0ff37 Issue #10924: Adding salt and Modular Crypt Format to crypt library.
Sean Reifscheider <jafo@tummy.com>
parents:
diff changeset
3 import _crypt
77814
74a1110a3b50 Issue 10924: Fixed mksalt() to use a RNG that is suitable for cryptographic purpose
Christian Heimes <christian@cheimes.de>
parents: 68106
diff changeset
4 import string as _string
74a1110a3b50 Issue 10924: Fixed mksalt() to use a RNG that is suitable for cryptographic purpose
Christian Heimes <christian@cheimes.de>
parents: 68106
diff changeset
5 from random import SystemRandom as _SystemRandom
74a1110a3b50 Issue 10924: Fixed mksalt() to use a RNG that is suitable for cryptographic purpose
Christian Heimes <christian@cheimes.de>
parents: 68106
diff changeset
6 from collections import namedtuple as _namedtuple
68097
372b2ef0ff37 Issue #10924: Adding salt and Modular Crypt Format to crypt library.
Sean Reifscheider <jafo@tummy.com>
parents:
diff changeset
7
68105
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
8
77814
74a1110a3b50 Issue 10924: Fixed mksalt() to use a RNG that is suitable for cryptographic purpose
Christian Heimes <christian@cheimes.de>
parents: 68106
diff changeset
9 _saltchars = _string.ascii_letters + _string.digits + './'
74a1110a3b50 Issue 10924: Fixed mksalt() to use a RNG that is suitable for cryptographic purpose
Christian Heimes <christian@cheimes.de>
parents: 68106
diff changeset
10 _sr = _SystemRandom()
68105
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
11
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
12
77814
74a1110a3b50 Issue 10924: Fixed mksalt() to use a RNG that is suitable for cryptographic purpose
Christian Heimes <christian@cheimes.de>
parents: 68106
diff changeset
13 class _Method(_namedtuple('_Method', 'name ident salt_chars total_size')):
68105
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
14
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
15 """Class representing a salt method per the Modular Crypt Format or the
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
16 legacy 2-character crypt method."""
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
17
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
18 def __repr__(self):
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
19 return '<crypt.METHOD_{}>'.format(self.name)
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
20
68097
372b2ef0ff37 Issue #10924: Adding salt and Modular Crypt Format to crypt library.
Sean Reifscheider <jafo@tummy.com>
parents:
diff changeset
21
68105
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
22 def mksalt(method=None):
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
23 """Generate a salt for the specified method.
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
24
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
25 If not specified, the strongest available method will be used.
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
26
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
27 """
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
28 if method is None:
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
29 method = methods[0]
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
30 s = '${}$'.format(method.ident) if method.ident else ''
85161
e8a314fe248b Issue #18405: Improve the entropy of crypt.mksalt().
Victor Stinner <victor.stinner@gmail.com>
parents: 77815
diff changeset
31 s += ''.join(_sr.choice(_saltchars) for char in range(method.salt_chars))
68105
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
32 return s
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
33
68097
372b2ef0ff37 Issue #10924: Adding salt and Modular Crypt Format to crypt library.
Sean Reifscheider <jafo@tummy.com>
parents:
diff changeset
34
68105
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
35 def crypt(word, salt=None):
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
36 """Return a string representing the one-way hash of a password, with a salt
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
37 prepended.
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
38
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
39 If ``salt`` is not specified or is ``None``, the strongest
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
40 available method will be selected and a salt generated. Otherwise,
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
41 ``salt`` may be one of the ``crypt.METHOD_*`` values, or a string as
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
42 returned by ``crypt.mksalt()``.
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
43
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
44 """
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
45 if salt is None or isinstance(salt, _Method):
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
46 salt = mksalt(salt)
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
47 return _crypt.crypt(word, salt)
68097
372b2ef0ff37 Issue #10924: Adding salt and Modular Crypt Format to crypt library.
Sean Reifscheider <jafo@tummy.com>
parents:
diff changeset
48
372b2ef0ff37 Issue #10924: Adding salt and Modular Crypt Format to crypt library.
Sean Reifscheider <jafo@tummy.com>
parents:
diff changeset
49
372b2ef0ff37 Issue #10924: Adding salt and Modular Crypt Format to crypt library.
Sean Reifscheider <jafo@tummy.com>
parents:
diff changeset
50 # available salting/crypto methods
68105
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
51 METHOD_CRYPT = _Method('CRYPT', None, 2, 13)
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
52 METHOD_MD5 = _Method('MD5', '1', 8, 34)
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
53 METHOD_SHA256 = _Method('SHA256', '5', 16, 63)
0586c699d467 Make Lib/crypt.py meet PEP 8 standards. This also led to a tweak in the new API
Brett Cannon <bcannon@gmail.com>
parents: 68097
diff changeset
54 METHOD_SHA512 = _Method('SHA512', '6', 16, 106)
68097
372b2ef0ff37 Issue #10924: Adding salt and Modular Crypt Format to crypt library.
Sean Reifscheider <jafo@tummy.com>
parents:
diff changeset
55
68106
62994662676a A crypt algorithm may not be available by returning None.
Brett Cannon <bcannon@gmail.com>
parents: 68105
diff changeset
56 methods = []
62994662676a A crypt algorithm may not be available by returning None.
Brett Cannon <bcannon@gmail.com>
parents: 68105
diff changeset
57 for _method in (METHOD_SHA512, METHOD_SHA256, METHOD_MD5):
62994662676a A crypt algorithm may not be available by returning None.
Brett Cannon <bcannon@gmail.com>
parents: 68105
diff changeset
58 _result = crypt('', _method)
62994662676a A crypt algorithm may not be available by returning None.
Brett Cannon <bcannon@gmail.com>
parents: 68105
diff changeset
59 if _result and len(_result) == _method.total_size:
62994662676a A crypt algorithm may not be available by returning None.
Brett Cannon <bcannon@gmail.com>
parents: 68105
diff changeset
60 methods.append(_method)
62994662676a A crypt algorithm may not be available by returning None.
Brett Cannon <bcannon@gmail.com>
parents: 68105
diff changeset
61 methods.append(METHOD_CRYPT)
62994662676a A crypt algorithm may not be available by returning None.
Brett Cannon <bcannon@gmail.com>
parents: 68105
diff changeset
62 del _result, _method