blob: 269f949d3f04e90897a39a24d1035842b7bf4947 [file] [log] [blame]
Paul Kehrerb6d764c2014-01-27 22:32:11 -06001.. hazmat::
2
Alex Stapletonc5fffd32014-03-18 15:29:00 +00003Key derivation functions
Paul Kehrerb6d764c2014-01-27 22:32:11 -06004========================
5
6.. currentmodule:: cryptography.hazmat.primitives.kdf
7
Paul Kehrer0b181182014-01-29 16:34:47 -06008Key derivation functions derive bytes suitable for cryptographic operations
9from passwords or other data sources using a pseudo-random function (PRF).
10Different KDFs are suitable for different tasks such as:
Paul Kehrer1cab1042014-01-29 14:30:11 -060011
Paul Kehrer0b181182014-01-29 16:34:47 -060012* Cryptographic key derivation
Paul Kehrer1cab1042014-01-29 14:30:11 -060013
14 Deriving a key suitable for use as input to an encryption algorithm.
15 Typically this means taking a password and running it through an algorithm
David Reidc0248b92014-01-30 15:23:33 -080016 such as :class:`~cryptography.hazmat.primitives.kdf.pbkdf2.PBKDF2HMAC` or
17 :class:`~cryptography.hazmat.primitives.kdf.hkdf.HKDF`.
Paul Kehrer1cab1042014-01-29 14:30:11 -060018 This process is typically known as `key stretching`_.
19
Paul Kehrer0b181182014-01-29 16:34:47 -060020* Password storage
Paul Kehrer1cab1042014-01-29 14:30:11 -060021
22 When storing passwords you want to use an algorithm that is computationally
23 intensive. Legitimate users will only need to compute it once (for example,
24 taking the user's password, running it through the KDF, then comparing it
25 to the stored value), while attackers will need to do it billions of times.
26 Ideal password storage KDFs will be demanding on both computational and
27 memory resources.
Paul Kehrerb6d764c2014-01-27 22:32:11 -060028
Paul Kehrer0b181182014-01-29 16:34:47 -060029.. currentmodule:: cryptography.hazmat.primitives.kdf.pbkdf2
30
31.. class:: PBKDF2HMAC(algorithm, length, salt, iterations, backend)
Paul Kehrerb6d764c2014-01-27 22:32:11 -060032
Paul Kehrer5d1af212014-01-28 12:19:32 -060033 .. versionadded:: 0.2
34
Paul Kehrer298e5332014-01-29 11:16:22 -060035 `PBKDF2`_ (Password Based Key Derivation Function 2) is typically used for
Paul Kehrer3d8c66f2014-01-28 17:36:50 -060036 deriving a cryptographic key from a password. It may also be used for
Paul Kehrer0b181182014-01-29 16:34:47 -060037 key storage, but an alternate key storage KDF such as `scrypt`_ is generally
Paul Kehrer1cab1042014-01-29 14:30:11 -060038 considered a better solution.
Paul Kehrer3d8c66f2014-01-28 17:36:50 -060039
Paul Kehrer5d1af212014-01-28 12:19:32 -060040 This class conforms to the
41 :class:`~cryptography.hazmat.primitives.interfaces.KeyDerivationFunction`
42 interface.
43
Paul Kehrerb6d764c2014-01-27 22:32:11 -060044 .. doctest::
45
Paul Kehrer5d1af212014-01-28 12:19:32 -060046 >>> import os
47 >>> from cryptography.hazmat.primitives import hashes
Paul Kehrerb3f763f2014-01-28 16:42:15 -060048 >>> from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
Paul Kehrerb6d764c2014-01-27 22:32:11 -060049 >>> from cryptography.hazmat.backends import default_backend
50 >>> backend = default_backend()
51 >>> salt = os.urandom(16)
52 >>> # derive
Paul Kehrerb3f763f2014-01-28 16:42:15 -060053 >>> kdf = PBKDF2HMAC(
54 ... algorithm=hashes.SHA256(),
55 ... length=32,
56 ... salt=salt,
Paul Kehrer1277bc72014-01-28 17:09:59 -060057 ... iterations=100000,
Paul Kehrerb3f763f2014-01-28 16:42:15 -060058 ... backend=backend
59 ... )
Paul Kehrerb6d764c2014-01-27 22:32:11 -060060 >>> key = kdf.derive(b"my great password")
61 >>> # verify
Paul Kehrerb3f763f2014-01-28 16:42:15 -060062 >>> kdf = PBKDF2HMAC(
63 ... algorithm=hashes.SHA256(),
64 ... length=32,
65 ... salt=salt,
Paul Kehrer1277bc72014-01-28 17:09:59 -060066 ... iterations=100000,
Paul Kehrerb3f763f2014-01-28 16:42:15 -060067 ... backend=backend
68 ... )
Paul Kehrerb6d764c2014-01-27 22:32:11 -060069 >>> kdf.verify(b"my great password", key)
Paul Kehrerb6d764c2014-01-27 22:32:11 -060070
Paul Kehrer5d1af212014-01-28 12:19:32 -060071 :param algorithm: An instance of a
72 :class:`~cryptography.hazmat.primitives.interfaces.HashAlgorithm`
73 provider.
74 :param int length: The desired length of the derived key. Maximum is
Paul Kehrerb3f763f2014-01-28 16:42:15 -060075 (2\ :sup:`32` - 1) * ``algorithm.digest_size``.
Paul Kehrer5d1af212014-01-28 12:19:32 -060076 :param bytes salt: A salt. `NIST SP 800-132`_ recommends 128-bits or
77 longer.
78 :param int iterations: The number of iterations to perform of the hash
Paul Kehrerc58b4782014-01-29 13:56:25 -060079 function. This can be used to control the length of time the operation
80 takes. Higher numbers help mitigate brute force attacks against derived
81 keys. See OWASP's `Password Storage Cheat Sheet`_ for more
Paul Kehrer3d8c66f2014-01-28 17:36:50 -060082 detailed recommendations if you intend to use this for password storage.
Paul Kehrer5d1af212014-01-28 12:19:32 -060083 :param backend: A
Paul Kehrer15a86a02014-01-29 17:44:47 -060084 :class:`~cryptography.hazmat.backends.interfaces.PBKDF2HMACBackend`
Paul Kehrer5d1af212014-01-28 12:19:32 -060085 provider.
Paul Kehrerb6d764c2014-01-27 22:32:11 -060086
Alex Gaynor7a489db2014-03-22 15:09:34 -070087 :raises cryptography.exceptions.UnsupportedAlgorithm: This is raised if the
Ayrx68702412014-03-15 23:29:36 +080088 provided ``backend`` does not implement
89 :class:`~cryptography.hazmat.backends.interfaces.PBKDF2HMACBackend`
90
Paul Kehrer3d8c66f2014-01-28 17:36:50 -060091 .. method:: derive(key_material)
92
Alex Gaynora8e125f2014-01-29 19:21:03 -080093 :param bytes key_material: The input key material. For PBKDF2 this
Paul Kehrer3d8c66f2014-01-28 17:36:50 -060094 should be a password.
Paul Kehrer0b181182014-01-29 16:34:47 -060095 :return bytes: the derived key.
Paul Kehrer3d8c66f2014-01-28 17:36:50 -060096 :raises cryptography.exceptions.AlreadyFinalized: This is raised when
97 :meth:`derive` or
98 :meth:`verify` is
99 called more than
100 once.
101
102 This generates and returns a new key from the supplied password.
103
104 .. method:: verify(key_material, expected_key)
105
Alex Gaynora8e125f2014-01-29 19:21:03 -0800106 :param bytes key_material: The input key material. This is the same as
Paul Kehrer3d8c66f2014-01-28 17:36:50 -0600107 ``key_material`` in :meth:`derive`.
Alex Gaynora8e125f2014-01-29 19:21:03 -0800108 :param bytes expected_key: The expected result of deriving a new key,
Paul Kehrer3d8c66f2014-01-28 17:36:50 -0600109 this is the same as the return value of
110 :meth:`derive`.
111 :raises cryptography.exceptions.InvalidKey: This is raised when the
112 derived key does not match
113 the expected key.
114 :raises cryptography.exceptions.AlreadyFinalized: This is raised when
115 :meth:`derive` or
116 :meth:`verify` is
117 called more than
118 once.
119
120 This checks whether deriving a new key from the supplied
121 ``key_material`` generates the same key as the ``expected_key``, and
122 raises an exception if they do not match. This can be used for
Paul Kehrer99d51902014-01-28 20:16:20 -0600123 checking whether the password a user provides matches the stored derived
Paul Kehrer3d8c66f2014-01-28 17:36:50 -0600124 key.
125
David Reidc0248b92014-01-30 15:23:33 -0800126
127.. currentmodule:: cryptography.hazmat.primitives.kdf.hkdf
128
129.. class:: HKDF(algorithm, length, salt, info, backend)
130
131 .. versionadded:: 0.2
132
David Reid2ad94ab2014-02-03 10:01:15 -0800133 `HKDF`_ (HMAC-based Extract-and-Expand Key Derivation Function) is suitable
David Reidc0248b92014-01-30 15:23:33 -0800134 for deriving keys of a fixed size used for other cryptographic operations.
Alex Gaynorc43bb752014-02-12 16:42:11 -0800135
136 .. warning::
137
138 HKDF should not be used for password storage.
David Reidc0248b92014-01-30 15:23:33 -0800139
David Reid5df929c2014-02-03 13:26:15 -0800140 .. doctest::
141
142 >>> import os
143 >>> from cryptography.hazmat.primitives import hashes
144 >>> from cryptography.hazmat.primitives.kdf.hkdf import HKDF
145 >>> from cryptography.hazmat.backends import default_backend
146 >>> backend = default_backend()
147 >>> salt = os.urandom(16)
148 >>> info = b"hkdf-example"
149 >>> hkdf = HKDF(
150 ... algorithm=hashes.SHA256(),
151 ... length=32,
152 ... salt=salt,
153 ... info=info,
154 ... backend=backend
155 ... )
David Reid134f1f42014-02-03 13:54:30 -0800156 >>> key = hkdf.derive(b"input key")
David Reid5df929c2014-02-03 13:26:15 -0800157 >>> hkdf = HKDF(
158 ... algorithm=hashes.SHA256(),
159 ... length=32,
160 ... salt=salt,
161 ... info=info,
162 ... backend=backend
163 ... )
164 >>> hkdf.verify(b"input key", key)
165
David Reidc0248b92014-01-30 15:23:33 -0800166 :param algorithm: An instance of a
167 :class:`~cryptography.hazmat.primitives.interfaces.HashAlgorithm`
168 provider.
169
170 :param int length: The desired length of the derived key. Maximum is
David Reidb89f34c2014-02-03 10:01:42 -0800171 ``255 * (algorithm.digest_size // 8)``.
David Reidc0248b92014-01-30 15:23:33 -0800172
David Reid2ad94ab2014-02-03 10:01:15 -0800173 :param bytes salt: A salt. Randomizes the KDF's output. Optional, but
174 highly recommended. Ideally as many bits of entropy as the security
175 level of the hash: often that means cryptographically random and as
176 long as the hash output. Worse (shorter, less entropy) salt values can
177 still meaningfully contribute to security. May be reused. Does not have
178 to be secret, but may cause stronger security guarantees if secret; see
179 `RFC 5869`_ and the `HKDF paper`_ for more details. If ``None`` is
180 explicitly passed a default salt of ``algorithm.digest_size // 8`` null
181 bytes will be used.
David Reidc0248b92014-01-30 15:23:33 -0800182
183 :param bytes info: Application specific context information. If ``None``
184 is explicitly passed an empty byte string will be used.
185
Wouter Bolsterleed63cbd02014-03-01 00:45:31 +0100186 :param backend: A
David Reidc0248b92014-01-30 15:23:33 -0800187 :class:`~cryptography.hazmat.backends.interfaces.HMACBackend`
188 provider.
189
Alex Gaynor7a489db2014-03-22 15:09:34 -0700190 :raises cryptography.exceptions.UnsupportedAlgorithm: This is raised if the
Ayrx68702412014-03-15 23:29:36 +0800191 provided ``backend`` does not implement
192 :class:`~cryptography.hazmat.backends.interfaces.HMACBackend`
193
David Reidc0248b92014-01-30 15:23:33 -0800194 .. method:: derive(key_material)
195
196 :param bytes key_material: The input key material.
197 :retunr bytes: The derived key.
198
199 Derives a new key from the input key material by performing both the
200 extract and expand operations.
201
202 .. method:: verify(key_material, expected_key)
203
204 :param key_material bytes: The input key material. This is the same as
205 ``key_material`` in :meth:`derive`.
206 :param expected_key bytes: The expected result of deriving a new key,
207 this is the same as the return value of
208 :meth:`derive`.
209 :raises cryptography.exceptions.InvalidKey: This is raised when the
210 derived key does not match
211 the expected key.
212 :raises cryptography.exceptions.AlreadyFinalized: This is raised when
213 :meth:`derive` or
214 :meth:`verify` is
215 called more than
216 once.
217
218 This checks whether deriving a new key from the supplied
219 ``key_material`` generates the same key as the ``expected_key``, and
David Reidb9fa7712014-02-03 10:45:11 -0800220 raises an exception if they do not match.
David Reidc0248b92014-01-30 15:23:33 -0800221
Paul Kehrerb6d764c2014-01-27 22:32:11 -0600222.. _`NIST SP 800-132`: http://csrc.nist.gov/publications/nistpubs/800-132/nist-sp800-132.pdf
Paul Kehrerb3f763f2014-01-28 16:42:15 -0600223.. _`Password Storage Cheat Sheet`: https://www.owasp.org/index.php/Password_Storage_Cheat_Sheet
David Reidb80deea2014-02-03 10:33:16 -0800224.. _`PBKDF2`: https://en.wikipedia.org/wiki/PBKDF2
225.. _`scrypt`: https://en.wikipedia.org/wiki/Scrypt
226.. _`key stretching`: https://en.wikipedia.org/wiki/Key_stretching
David Reid2ad94ab2014-02-03 10:01:15 -0800227.. _`HKDF`:
David Reidb80deea2014-02-03 10:33:16 -0800228.. _`RFC 5869`: https://tools.ietf.org/html/rfc5869
229.. _`HKDF paper`: https://eprint.iacr.org/2010/264