blob: be03b19cb8c7215bfdf82612590af7866c9bd543 [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
Paul Kehrer48402ff2015-02-16 15:31:52 -06006.. module:: cryptography.hazmat.primitives.kdf
Paul Kehrerb6d764c2014-01-27 22:32:11 -06007
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
Alex Gaynorc3a3ed42016-10-07 09:34:58 -050037 key storage, but an alternate key storage KDF such as
38 :class:`~cryptography.hazmat.primitives.kdf.scrypt.Scrypt` is generally
Paul Kehrer1cab1042014-01-29 14:30:11 -060039 considered a better solution.
Paul Kehrer3d8c66f2014-01-28 17:36:50 -060040
Paul Kehrer5d1af212014-01-28 12:19:32 -060041 This class conforms to the
Paul Kehrer48402ff2015-02-16 15:31:52 -060042 :class:`~cryptography.hazmat.primitives.kdf.KeyDerivationFunction`
Paul Kehrer5d1af212014-01-28 12:19:32 -060043 interface.
44
Paul Kehrerb6d764c2014-01-27 22:32:11 -060045 .. doctest::
46
Paul Kehrer5d1af212014-01-28 12:19:32 -060047 >>> import os
48 >>> from cryptography.hazmat.primitives import hashes
Paul Kehrerb3f763f2014-01-28 16:42:15 -060049 >>> from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
Paul Kehrerb6d764c2014-01-27 22:32:11 -060050 >>> from cryptography.hazmat.backends import default_backend
51 >>> backend = default_backend()
Cory Benfield9b22eb92017-05-22 22:40:40 -070052 >>> # Salts should be randomly generated
Paul Kehrerb6d764c2014-01-27 22:32:11 -060053 >>> salt = os.urandom(16)
54 >>> # derive
Paul Kehrerb3f763f2014-01-28 16:42:15 -060055 >>> kdf = PBKDF2HMAC(
56 ... algorithm=hashes.SHA256(),
57 ... length=32,
58 ... salt=salt,
Paul Kehrer1277bc72014-01-28 17:09:59 -060059 ... iterations=100000,
Paul Kehrerb3f763f2014-01-28 16:42:15 -060060 ... backend=backend
61 ... )
Paul Kehrerb6d764c2014-01-27 22:32:11 -060062 >>> key = kdf.derive(b"my great password")
63 >>> # verify
Paul Kehrerb3f763f2014-01-28 16:42:15 -060064 >>> kdf = PBKDF2HMAC(
65 ... algorithm=hashes.SHA256(),
66 ... length=32,
67 ... salt=salt,
Paul Kehrer1277bc72014-01-28 17:09:59 -060068 ... iterations=100000,
Paul Kehrerb3f763f2014-01-28 16:42:15 -060069 ... backend=backend
70 ... )
Paul Kehrerb6d764c2014-01-27 22:32:11 -060071 >>> kdf.verify(b"my great password", key)
Paul Kehrerb6d764c2014-01-27 22:32:11 -060072
Gabriel Orisaka617fe4b2016-07-31 10:49:59 -030073 :param algorithm: An instance of
74 :class:`~cryptography.hazmat.primitives.hashes.HashAlgorithm`.
Paul Kehrera857fe62017-06-28 23:03:29 -050075 :param int length: The desired length of the derived key in bytes. Maximum
76 is (2\ :sup:`32` - 1) * ``algorithm.digest_size``.
Cory Benfield9b22eb92017-05-22 22:40:40 -070077 :param bytes salt: A salt. Secure values [#nist]_ are 128-bits (16 bytes)
78 or longer and randomly generated.
Paul Kehrer5d1af212014-01-28 12:19:32 -060079 :param int iterations: The number of iterations to perform of the hash
Paul Kehrerc58b4782014-01-29 13:56:25 -060080 function. This can be used to control the length of time the operation
81 takes. Higher numbers help mitigate brute force attacks against derived
82 keys. See OWASP's `Password Storage Cheat Sheet`_ for more
Paul Kehrer3d8c66f2014-01-28 17:36:50 -060083 detailed recommendations if you intend to use this for password storage.
Gabriel Orisaka617fe4b2016-07-31 10:49:59 -030084 :param backend: An instance of
85 :class:`~cryptography.hazmat.backends.interfaces.PBKDF2HMACBackend`.
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
Ayrx00eff9c2014-05-17 19:47:09 +080091 :raises TypeError: This exception is raised if ``salt`` is not ``bytes``.
Ayrx6d69eab2014-05-17 16:59:31 +080092
Paul Kehrer3d8c66f2014-01-28 17:36:50 -060093 .. method:: derive(key_material)
94
Paul Kehrer62e22a52019-01-17 15:53:16 -060095 :param key_material: The input key material. For PBKDF2 this
Paul Kehrer3d8c66f2014-01-28 17:36:50 -060096 should be a password.
Paul Kehrer62e22a52019-01-17 15:53:16 -060097 :type key_material: :term:`bytes-like`
Paul Kehrer0b181182014-01-29 16:34:47 -060098 :return bytes: the derived key.
Paul Kehrer3d8c66f2014-01-28 17:36:50 -060099 :raises cryptography.exceptions.AlreadyFinalized: This is raised when
100 :meth:`derive` or
101 :meth:`verify` is
102 called more than
103 once.
104
Ayrx6d69eab2014-05-17 16:59:31 +0800105 :raises TypeError: This exception is raised if ``key_material`` is not
Ayrx00eff9c2014-05-17 19:47:09 +0800106 ``bytes``.
Ayrx6d69eab2014-05-17 16:59:31 +0800107
Paul Kehrer3d8c66f2014-01-28 17:36:50 -0600108 This generates and returns a new key from the supplied password.
109
110 .. method:: verify(key_material, expected_key)
111
Alex Gaynora8e125f2014-01-29 19:21:03 -0800112 :param bytes key_material: The input key material. This is the same as
Paul Kehrer3d8c66f2014-01-28 17:36:50 -0600113 ``key_material`` in :meth:`derive`.
Alex Gaynora8e125f2014-01-29 19:21:03 -0800114 :param bytes expected_key: The expected result of deriving a new key,
Paul Kehrer3d8c66f2014-01-28 17:36:50 -0600115 this is the same as the return value of
116 :meth:`derive`.
117 :raises cryptography.exceptions.InvalidKey: This is raised when the
118 derived key does not match
119 the expected key.
120 :raises cryptography.exceptions.AlreadyFinalized: This is raised when
121 :meth:`derive` or
122 :meth:`verify` is
123 called more than
124 once.
125
126 This checks whether deriving a new key from the supplied
127 ``key_material`` generates the same key as the ``expected_key``, and
128 raises an exception if they do not match. This can be used for
Paul Kehrer99d51902014-01-28 20:16:20 -0600129 checking whether the password a user provides matches the stored derived
Paul Kehrer3d8c66f2014-01-28 17:36:50 -0600130 key.
131
David Reidc0248b92014-01-30 15:23:33 -0800132
133.. currentmodule:: cryptography.hazmat.primitives.kdf.hkdf
134
135.. class:: HKDF(algorithm, length, salt, info, backend)
136
137 .. versionadded:: 0.2
138
David Reid2ad94ab2014-02-03 10:01:15 -0800139 `HKDF`_ (HMAC-based Extract-and-Expand Key Derivation Function) is suitable
David Reidc0248b92014-01-30 15:23:33 -0800140 for deriving keys of a fixed size used for other cryptographic operations.
Alex Gaynorc43bb752014-02-12 16:42:11 -0800141
142 .. warning::
143
144 HKDF should not be used for password storage.
David Reidc0248b92014-01-30 15:23:33 -0800145
David Reid5df929c2014-02-03 13:26:15 -0800146 .. doctest::
147
148 >>> import os
149 >>> from cryptography.hazmat.primitives import hashes
150 >>> from cryptography.hazmat.primitives.kdf.hkdf import HKDF
151 >>> from cryptography.hazmat.backends import default_backend
152 >>> backend = default_backend()
153 >>> salt = os.urandom(16)
154 >>> info = b"hkdf-example"
155 >>> hkdf = HKDF(
156 ... algorithm=hashes.SHA256(),
157 ... length=32,
158 ... salt=salt,
159 ... info=info,
160 ... backend=backend
161 ... )
David Reid134f1f42014-02-03 13:54:30 -0800162 >>> key = hkdf.derive(b"input key")
David Reid5df929c2014-02-03 13:26:15 -0800163 >>> hkdf = HKDF(
164 ... algorithm=hashes.SHA256(),
165 ... length=32,
166 ... salt=salt,
167 ... info=info,
168 ... backend=backend
169 ... )
170 >>> hkdf.verify(b"input key", key)
171
Gabriel Orisaka617fe4b2016-07-31 10:49:59 -0300172 :param algorithm: An instance of
173 :class:`~cryptography.hazmat.primitives.hashes.HashAlgorithm`.
David Reidc0248b92014-01-30 15:23:33 -0800174
Paul Kehrera857fe62017-06-28 23:03:29 -0500175 :param int length: The desired length of the derived key in bytes. Maximum
176 is ``255 * (algorithm.digest_size // 8)``.
David Reidc0248b92014-01-30 15:23:33 -0800177
David Reid2ad94ab2014-02-03 10:01:15 -0800178 :param bytes salt: A salt. Randomizes the KDF's output. Optional, but
179 highly recommended. Ideally as many bits of entropy as the security
180 level of the hash: often that means cryptographically random and as
181 long as the hash output. Worse (shorter, less entropy) salt values can
182 still meaningfully contribute to security. May be reused. Does not have
183 to be secret, but may cause stronger security guarantees if secret; see
Alex Gaynor2e8725d2016-08-29 21:40:19 -0400184 :rfc:`5869` and the `HKDF paper`_ for more details. If ``None`` is
David Reid2ad94ab2014-02-03 10:01:15 -0800185 explicitly passed a default salt of ``algorithm.digest_size // 8`` null
186 bytes will be used.
David Reidc0248b92014-01-30 15:23:33 -0800187
188 :param bytes info: Application specific context information. If ``None``
189 is explicitly passed an empty byte string will be used.
190
Gabriel Orisaka617fe4b2016-07-31 10:49:59 -0300191 :param backend: An instance of
192 :class:`~cryptography.hazmat.backends.interfaces.HMACBackend`.
David Reidc0248b92014-01-30 15:23:33 -0800193
Alex Gaynor7a489db2014-03-22 15:09:34 -0700194 :raises cryptography.exceptions.UnsupportedAlgorithm: This is raised if the
Ayrx68702412014-03-15 23:29:36 +0800195 provided ``backend`` does not implement
196 :class:`~cryptography.hazmat.backends.interfaces.HMACBackend`
197
Ayrx6d69eab2014-05-17 16:59:31 +0800198 :raises TypeError: This exception is raised if ``salt`` or ``info`` is not
Ayrx00eff9c2014-05-17 19:47:09 +0800199 ``bytes``.
Ayrx6d69eab2014-05-17 16:59:31 +0800200
David Reidc0248b92014-01-30 15:23:33 -0800201 .. method:: derive(key_material)
202
Paul Kehrer62e22a52019-01-17 15:53:16 -0600203 :param key_material: The input key material.
204 :type key_material: :term:`bytes-like`
Ayrx1534e092014-05-06 14:19:46 +0800205 :return bytes: The derived key.
Ayrx6d69eab2014-05-17 16:59:31 +0800206 :raises TypeError: This exception is raised if ``key_material`` is not
Ayrx00eff9c2014-05-17 19:47:09 +0800207 ``bytes``.
David Reidc0248b92014-01-30 15:23:33 -0800208
209 Derives a new key from the input key material by performing both the
210 extract and expand operations.
211
212 .. method:: verify(key_material, expected_key)
213
Alex Gaynor1cfc5d52014-11-23 17:44:28 -0600214 :param bytes key_material: The input key material. This is the same as
David Reidc0248b92014-01-30 15:23:33 -0800215 ``key_material`` in :meth:`derive`.
Alex Gaynor1cfc5d52014-11-23 17:44:28 -0600216 :param bytes expected_key: The expected result of deriving a new key,
David Reidc0248b92014-01-30 15:23:33 -0800217 this is the same as the return value of
218 :meth:`derive`.
219 :raises cryptography.exceptions.InvalidKey: This is raised when the
220 derived key does not match
221 the expected key.
222 :raises cryptography.exceptions.AlreadyFinalized: This is raised when
223 :meth:`derive` or
224 :meth:`verify` is
225 called more than
226 once.
227
228 This checks whether deriving a new key from the supplied
229 ``key_material`` generates the same key as the ``expected_key``, and
David Reidb9fa7712014-02-03 10:45:11 -0800230 raises an exception if they do not match.
David Reidc0248b92014-01-30 15:23:33 -0800231
Ayrx9d72f122014-05-06 20:27:51 +0800232
Ayrxc0ce9112014-05-07 16:22:09 +0800233.. class:: HKDFExpand(algorithm, length, info, backend)
Ayrx9d72f122014-05-06 20:27:51 +0800234
235 .. versionadded:: 0.5
236
237 HKDF consists of two stages, extract and expand. This class exposes an
238 expand only version of HKDF that is suitable when the key material is
239 already cryptographically strong.
240
241 .. warning::
242
Ayrxc0ce9112014-05-07 16:22:09 +0800243 HKDFExpand should only be used if the key material is
Ayrx9d72f122014-05-06 20:27:51 +0800244 cryptographically strong. You should use
245 :class:`~cryptography.hazmat.primitives.kdf.hkdf.HKDF` if
246 you are unsure.
247
248 .. doctest::
249
250 >>> import os
251 >>> from cryptography.hazmat.primitives import hashes
Ayrxc0ce9112014-05-07 16:22:09 +0800252 >>> from cryptography.hazmat.primitives.kdf.hkdf import HKDFExpand
Ayrx9d72f122014-05-06 20:27:51 +0800253 >>> from cryptography.hazmat.backends import default_backend
254 >>> backend = default_backend()
255 >>> info = b"hkdf-example"
256 >>> key_material = os.urandom(16)
Ayrxc0ce9112014-05-07 16:22:09 +0800257 >>> hkdf = HKDFExpand(
Ayrx9d72f122014-05-06 20:27:51 +0800258 ... algorithm=hashes.SHA256(),
259 ... length=32,
260 ... info=info,
261 ... backend=backend
262 ... )
263 >>> key = hkdf.derive(key_material)
Ayrxc0ce9112014-05-07 16:22:09 +0800264 >>> hkdf = HKDFExpand(
Ayrx9d72f122014-05-06 20:27:51 +0800265 ... algorithm=hashes.SHA256(),
266 ... length=32,
267 ... info=info,
268 ... backend=backend
269 ... )
270 >>> hkdf.verify(key_material, key)
271
Gabriel Orisaka617fe4b2016-07-31 10:49:59 -0300272 :param algorithm: An instance of
273 :class:`~cryptography.hazmat.primitives.hashes.HashAlgorithm`.
Ayrx9d72f122014-05-06 20:27:51 +0800274
Paul Kehrera857fe62017-06-28 23:03:29 -0500275 :param int length: The desired length of the derived key in bytes. Maximum
276 is ``255 * (algorithm.digest_size // 8)``.
Ayrx9d72f122014-05-06 20:27:51 +0800277
278 :param bytes info: Application specific context information. If ``None``
279 is explicitly passed an empty byte string will be used.
280
Gabriel Orisaka617fe4b2016-07-31 10:49:59 -0300281 :param backend: An instance of
282 :class:`~cryptography.hazmat.backends.interfaces.HMACBackend`.
Ayrx9d72f122014-05-06 20:27:51 +0800283
284 :raises cryptography.exceptions.UnsupportedAlgorithm: This is raised if the
285 provided ``backend`` does not implement
286 :class:`~cryptography.hazmat.backends.interfaces.HMACBackend`
Ayrx00eff9c2014-05-17 19:47:09 +0800287 :raises TypeError: This exception is raised if ``info`` is not ``bytes``.
Ayrx9d72f122014-05-06 20:27:51 +0800288
289 .. method:: derive(key_material)
290
291 :param bytes key_material: The input key material.
292 :return bytes: The derived key.
293
Ayrx6d69eab2014-05-17 16:59:31 +0800294 :raises TypeError: This exception is raised if ``key_material`` is not
Ayrx00eff9c2014-05-17 19:47:09 +0800295 ``bytes``.
Ayrxc48100a2014-05-10 13:01:46 +0800296
Ayrx9d72f122014-05-06 20:27:51 +0800297 Derives a new key from the input key material by performing both the
298 extract and expand operations.
299
300 .. method:: verify(key_material, expected_key)
301
Alex Gaynor1cfc5d52014-11-23 17:44:28 -0600302 :param bytes key_material: The input key material. This is the same as
Ayrx9d72f122014-05-06 20:27:51 +0800303 ``key_material`` in :meth:`derive`.
Alex Gaynor1cfc5d52014-11-23 17:44:28 -0600304 :param bytes expected_key: The expected result of deriving a new key,
Ayrx9d72f122014-05-06 20:27:51 +0800305 this is the same as the return value of
306 :meth:`derive`.
307 :raises cryptography.exceptions.InvalidKey: This is raised when the
308 derived key does not match
309 the expected key.
310 :raises cryptography.exceptions.AlreadyFinalized: This is raised when
311 :meth:`derive` or
312 :meth:`verify` is
313 called more than
314 once.
Ayrxc48100a2014-05-10 13:01:46 +0800315 :raises TypeError: This is raised if the provided ``key_material`` is
Alex Gaynor617825d2018-05-12 14:33:20 -0400316 a ``unicode`` object
Ayrx9d72f122014-05-06 20:27:51 +0800317
318 This checks whether deriving a new key from the supplied
319 ``key_material`` generates the same key as the ``expected_key``, and
320 raises an exception if they do not match.
321
Simo Sorce8a690fb2015-05-01 15:56:30 -0400322.. currentmodule:: cryptography.hazmat.primitives.kdf.concatkdf
323
324.. class:: ConcatKDFHash(algorithm, length, otherinfo, backend)
325
326 .. versionadded:: 1.0
327
328 ConcatKDFHash (Concatenation Key Derivation Function) is defined by the
329 NIST Special Publication `NIST SP 800-56Ar2`_ document, to be used to
330 derive keys for use after a Key Exchange negotiation operation.
331
332 .. warning::
333
334 ConcatKDFHash should not be used for password storage.
335
336 .. doctest::
337
338 >>> import os
339 >>> from cryptography.hazmat.primitives import hashes
340 >>> from cryptography.hazmat.primitives.kdf.concatkdf import ConcatKDFHash
341 >>> from cryptography.hazmat.backends import default_backend
342 >>> backend = default_backend()
Simo Sorce8a690fb2015-05-01 15:56:30 -0400343 >>> otherinfo = b"concatkdf-example"
344 >>> ckdf = ConcatKDFHash(
345 ... algorithm=hashes.SHA256(),
Paul Kehrera857fe62017-06-28 23:03:29 -0500346 ... length=32,
Simo Sorce8a690fb2015-05-01 15:56:30 -0400347 ... otherinfo=otherinfo,
348 ... backend=backend
349 ... )
350 >>> key = ckdf.derive(b"input key")
351 >>> ckdf = ConcatKDFHash(
352 ... algorithm=hashes.SHA256(),
Paul Kehrera857fe62017-06-28 23:03:29 -0500353 ... length=32,
Simo Sorce8a690fb2015-05-01 15:56:30 -0400354 ... otherinfo=otherinfo,
355 ... backend=backend
356 ... )
357 >>> ckdf.verify(b"input key", key)
358
Gabriel Orisaka617fe4b2016-07-31 10:49:59 -0300359 :param algorithm: An instance of
360 :class:`~cryptography.hazmat.primitives.hashes.HashAlgorithm`.
Simo Sorce8a690fb2015-05-01 15:56:30 -0400361
362 :param int length: The desired length of the derived key in bytes.
363 Maximum is ``hashlen * (2^32 -1)``.
364
365 :param bytes otherinfo: Application specific context information.
366 If ``None`` is explicitly passed an empty byte string will be used.
367
Gabriel Orisaka617fe4b2016-07-31 10:49:59 -0300368 :param backend: An instance of
369 :class:`~cryptography.hazmat.backends.interfaces.HashBackend`.
Simo Sorce8a690fb2015-05-01 15:56:30 -0400370
371 :raises cryptography.exceptions.UnsupportedAlgorithm: This is raised
372 if the provided ``backend`` does not implement
373 :class:`~cryptography.hazmat.backends.interfaces.HashBackend`
374
375 :raises TypeError: This exception is raised if ``otherinfo`` is not
376 ``bytes``.
377
378 .. method:: derive(key_material)
379
Paul Kehrera7799442019-01-17 15:56:23 -0600380 :param key_material: The input key material.
381 :type key_material: :term:`bytes-like`
Simo Sorce8a690fb2015-05-01 15:56:30 -0400382 :return bytes: The derived key.
383 :raises TypeError: This exception is raised if ``key_material`` is
384 not ``bytes``.
385
Terry Chiadae40762015-06-13 11:26:16 +0800386 Derives a new key from the input key material.
Simo Sorce8a690fb2015-05-01 15:56:30 -0400387
388 .. method:: verify(key_material, expected_key)
389
390 :param bytes key_material: The input key material. This is the same as
391 ``key_material`` in :meth:`derive`.
392 :param bytes expected_key: The expected result of deriving a new key,
393 this is the same as the return value of
394 :meth:`derive`.
395 :raises cryptography.exceptions.InvalidKey: This is raised when the
396 derived key does not match
397 the expected key.
398 :raises cryptography.exceptions.AlreadyFinalized: This is raised when
399 :meth:`derive` or
400 :meth:`verify` is
401 called more than
402 once.
403
404 This checks whether deriving a new key from the supplied
405 ``key_material`` generates the same key as the ``expected_key``, and
406 raises an exception if they do not match.
407
408
409.. class:: ConcatKDFHMAC(algorithm, length, salt, otherinfo, backend)
410
411 .. versionadded:: 1.0
412
413 Similar to ConcatKFDHash but uses an HMAC function instead.
414
415 .. warning::
416
417 ConcatKDFHMAC should not be used for password storage.
418
419 .. doctest::
420
421 >>> import os
422 >>> from cryptography.hazmat.primitives import hashes
423 >>> from cryptography.hazmat.primitives.kdf.concatkdf import ConcatKDFHMAC
424 >>> from cryptography.hazmat.backends import default_backend
425 >>> backend = default_backend()
426 >>> salt = os.urandom(16)
427 >>> otherinfo = b"concatkdf-example"
428 >>> ckdf = ConcatKDFHMAC(
429 ... algorithm=hashes.SHA256(),
Paul Kehrera857fe62017-06-28 23:03:29 -0500430 ... length=32,
Simo Sorce8a690fb2015-05-01 15:56:30 -0400431 ... salt=salt,
432 ... otherinfo=otherinfo,
433 ... backend=backend
434 ... )
435 >>> key = ckdf.derive(b"input key")
436 >>> ckdf = ConcatKDFHMAC(
437 ... algorithm=hashes.SHA256(),
Paul Kehrera857fe62017-06-28 23:03:29 -0500438 ... length=32,
Simo Sorce8a690fb2015-05-01 15:56:30 -0400439 ... salt=salt,
440 ... otherinfo=otherinfo,
441 ... backend=backend
442 ... )
443 >>> ckdf.verify(b"input key", key)
444
Gabriel Orisaka617fe4b2016-07-31 10:49:59 -0300445 :param algorithm: An instance of
446 :class:`~cryptography.hazmat.primitives.hashes.HashAlgorithm`.
Simo Sorce8a690fb2015-05-01 15:56:30 -0400447
448 :param int length: The desired length of the derived key in bytes. Maximum
449 is ``hashlen * (2^32 -1)``.
450
451 :param bytes salt: A salt. Randomizes the KDF's output. Optional, but
452 highly recommended. Ideally as many bits of entropy as the security
453 level of the hash: often that means cryptographically random and as
454 long as the hash output. Does not have to be secret, but may cause
455 stronger security guarantees if secret; If ``None`` is explicitly
456 passed a default salt of ``algorithm.block_size`` null bytes will be
457 used.
458
459 :param bytes otherinfo: Application specific context information.
460 If ``None`` is explicitly passed an empty byte string will be used.
461
Gabriel Orisaka617fe4b2016-07-31 10:49:59 -0300462 :param backend: An instance of
463 :class:`~cryptography.hazmat.backends.interfaces.HMACBackend`.
Simo Sorce8a690fb2015-05-01 15:56:30 -0400464
465 :raises cryptography.exceptions.UnsupportedAlgorithm: This is raised if the
466 provided ``backend`` does not implement
467 :class:`~cryptography.hazmat.backends.interfaces.HMACBackend`
468
469 :raises TypeError: This exception is raised if ``salt`` or ``otherinfo``
470 is not ``bytes``.
471
472 .. method:: derive(key_material)
473
474 :param bytes key_material: The input key material.
475 :return bytes: The derived key.
476 :raises TypeError: This exception is raised if ``key_material`` is not
477 ``bytes``.
478
Terry Chiadae40762015-06-13 11:26:16 +0800479 Derives a new key from the input key material.
Simo Sorce8a690fb2015-05-01 15:56:30 -0400480
481 .. method:: verify(key_material, expected_key)
482
483 :param bytes key_material: The input key material. This is the same as
484 ``key_material`` in :meth:`derive`.
485 :param bytes expected_key: The expected result of deriving a new key,
486 this is the same as the return value of
487 :meth:`derive`.
488 :raises cryptography.exceptions.InvalidKey: This is raised when the
489 derived key does not match
490 the expected key.
491 :raises cryptography.exceptions.AlreadyFinalized: This is raised when
492 :meth:`derive` or
493 :meth:`verify` is
494 called more than
495 once.
496
497 This checks whether deriving a new key from the supplied
498 ``key_material`` generates the same key as the ``expected_key``, and
499 raises an exception if they do not match.
500
Simo Sorce53c8f6a2015-09-15 11:13:56 -0400501.. currentmodule:: cryptography.hazmat.primitives.kdf.x963kdf
502
503.. class:: X963KDF(algorithm, length, otherinfo, backend)
504
505 .. versionadded:: 1.1
506
507 X963KDF (ANSI X9.63 Key Derivation Function) is defined by ANSI
508 in the `ANSI X9.63:2001`_ document, to be used to derive keys for use
509 after a Key Exchange negotiation operation.
510
511 SECG in `SEC 1 v2.0`_ recommends that
512 :class:`~cryptography.hazmat.primitives.kdf.concatkdf.ConcatKDFHash` be
513 used for new projects. This KDF should only be used for backwards
Alex Gaynorace036d2015-09-24 20:23:08 -0400514 compatibility with pre-existing protocols.
Simo Sorce53c8f6a2015-09-15 11:13:56 -0400515
516
517 .. warning::
518
519 X963KDF should not be used for password storage.
520
521 .. doctest::
522
523 >>> import os
524 >>> from cryptography.hazmat.primitives import hashes
525 >>> from cryptography.hazmat.primitives.kdf.x963kdf import X963KDF
526 >>> from cryptography.hazmat.backends import default_backend
527 >>> backend = default_backend()
528 >>> sharedinfo = b"ANSI X9.63 Example"
529 >>> xkdf = X963KDF(
530 ... algorithm=hashes.SHA256(),
Paul Kehrera857fe62017-06-28 23:03:29 -0500531 ... length=32,
Simo Sorce53c8f6a2015-09-15 11:13:56 -0400532 ... sharedinfo=sharedinfo,
533 ... backend=backend
534 ... )
535 >>> key = xkdf.derive(b"input key")
536 >>> xkdf = X963KDF(
537 ... algorithm=hashes.SHA256(),
Paul Kehrera857fe62017-06-28 23:03:29 -0500538 ... length=32,
Simo Sorce53c8f6a2015-09-15 11:13:56 -0400539 ... sharedinfo=sharedinfo,
540 ... backend=backend
541 ... )
542 >>> xkdf.verify(b"input key", key)
543
Gabriel Orisaka617fe4b2016-07-31 10:49:59 -0300544 :param algorithm: An instance of
545 :class:`~cryptography.hazmat.primitives.hashes.HashAlgorithm`.
Simo Sorce53c8f6a2015-09-15 11:13:56 -0400546
547 :param int length: The desired length of the derived key in bytes.
548 Maximum is ``hashlen * (2^32 -1)``.
549
550 :param bytes sharedinfo: Application specific context information.
551 If ``None`` is explicitly passed an empty byte string will be used.
552
553 :param backend: A cryptography backend
554 :class:`~cryptography.hazmat.backends.interfaces.HashBackend`
Gabriel Orisaka617fe4b2016-07-31 10:49:59 -0300555 instance.
Simo Sorce53c8f6a2015-09-15 11:13:56 -0400556
557 :raises cryptography.exceptions.UnsupportedAlgorithm: This is raised
558 if the provided ``backend`` does not implement
559 :class:`~cryptography.hazmat.backends.interfaces.HashBackend`
560
561 :raises TypeError: This exception is raised if ``sharedinfo`` is not
562 ``bytes``.
563
564 .. method:: derive(key_material)
565
Paul Kehrera7799442019-01-17 15:56:23 -0600566 :param key_material: The input key material.
567 :type key_material: :term:`bytes-like`
Simo Sorce53c8f6a2015-09-15 11:13:56 -0400568 :return bytes: The derived key.
569 :raises TypeError: This exception is raised if ``key_material`` is
570 not ``bytes``.
571
572 Derives a new key from the input key material.
573
574 .. method:: verify(key_material, expected_key)
575
576 :param bytes key_material: The input key material. This is the same as
577 ``key_material`` in :meth:`derive`.
578 :param bytes expected_key: The expected result of deriving a new key,
579 this is the same as the return value of
580 :meth:`derive`.
581 :raises cryptography.exceptions.InvalidKey: This is raised when the
582 derived key does not match
583 the expected key.
584 :raises cryptography.exceptions.AlreadyFinalized: This is raised when
585 :meth:`derive` or
586 :meth:`verify` is
587 called more than
588 once.
589
590 This checks whether deriving a new key from the supplied
591 ``key_material`` generates the same key as the ``expected_key``, and
592 raises an exception if they do not match.
593
Simo Sorce8a690fb2015-05-01 15:56:30 -0400594
Jared6d7fe002016-05-29 17:32:37 -0700595.. currentmodule:: cryptography.hazmat.primitives.kdf.kbkdf
596
597.. class:: KBKDFHMAC(algorithm, mode, length, rlen, llen, location,\
598 label, context, fixed, backend)
599
600 .. versionadded:: 1.4
601
602 KBKDF (Key Based Key Derivation Function) is defined by the
603 `NIST SP 800-108`_ document, to be used to derive additional
604 keys from a key that has been established through an automated
605 key-establishment scheme.
606
607 .. warning::
608
609 KBKDFHMAC should not be used for password storage.
610
611 .. doctest::
612
613 >>> import os
614 >>> from cryptography.hazmat.primitives import hashes
615 >>> from cryptography.hazmat.primitives.kdf.kbkdf import (
616 ... CounterLocation, KBKDFHMAC, Mode
617 ... )
618 >>> from cryptography.hazmat.backends import default_backend
619 >>> backend = default_backend()
620 >>> label = b"KBKDF HMAC Label"
621 >>> context = b"KBKDF HMAC Context"
622 >>> kdf = KBKDFHMAC(
623 ... algorithm=hashes.SHA256(),
624 ... mode=Mode.CounterMode,
Paul Kehrera857fe62017-06-28 23:03:29 -0500625 ... length=32,
Jared6d7fe002016-05-29 17:32:37 -0700626 ... rlen=4,
627 ... llen=4,
628 ... location=CounterLocation.BeforeFixed,
629 ... label=label,
630 ... context=context,
631 ... fixed=None,
632 ... backend=backend
633 ... )
634 >>> key = kdf.derive(b"input key")
635 >>> kdf = KBKDFHMAC(
636 ... algorithm=hashes.SHA256(),
637 ... mode=Mode.CounterMode,
Paul Kehrera857fe62017-06-28 23:03:29 -0500638 ... length=32,
Jared6d7fe002016-05-29 17:32:37 -0700639 ... rlen=4,
640 ... llen=4,
641 ... location=CounterLocation.BeforeFixed,
642 ... label=label,
643 ... context=context,
644 ... fixed=None,
645 ... backend=backend
646 ... )
647 >>> kdf.verify(b"input key", key)
648
Gabriel Orisaka617fe4b2016-07-31 10:49:59 -0300649 :param algorithm: An instance of
650 :class:`~cryptography.hazmat.primitives.hashes.HashAlgorithm`.
Jared6d7fe002016-05-29 17:32:37 -0700651
652 :param mode: The desired mode of the PRF. A value from the
653 :class:`~cryptography.hazmat.primitives.kdf.kbkdf.Mode` enum.
654
655 :param int length: The desired length of the derived key in bytes.
656
657 :param int rlen: An integer that indicates the length of the binary
658 representation of the counter in bytes.
659
660 :param int llen: An integer that indicates the binary
661 representation of the ``length`` in bytes.
662
663 :param location: The desired location of the counter. A value from the
664 :class:`~cryptography.hazmat.primitives.kdf.kbkdf.CounterLocation` enum.
665
666 :param bytes label: Application specific label information. If ``None``
667 is explicitly passed an empty byte string will be used.
668
669 :param bytes context: Application specific context information. If ``None``
670 is explicitly passed an empty byte string will be used.
671
672 :param bytes fixed: Instead of specifying ``label`` and ``context`` you
673 may supply your own fixed data. If ``fixed`` is specified, ``label``
674 and ``context`` is ignored.
675
676 :param backend: A cryptography backend
677 :class:`~cryptography.hazmat.backends.interfaces.HashBackend`
Gabriel Orisaka617fe4b2016-07-31 10:49:59 -0300678 instance.
Jared6d7fe002016-05-29 17:32:37 -0700679
680 :raises cryptography.exceptions.UnsupportedAlgorithm: This is raised
681 if the provided ``backend`` does not implement
682 :class:`~cryptography.hazmat.backends.interfaces.HashBackend`
683
684 :raises TypeError: This exception is raised if ``label`` or ``context``
685 is not ``bytes``. Also raised if ``rlen`` or ``llen`` is not ``int``.
686
687 :raises ValueError: This exception is raised if ``rlen`` or ``llen``
688 is greater than 4 or less than 1. This exception is also raised if
689 you specify a ``label`` or ``context`` and ``fixed``.
690
691 .. method:: derive(key_material)
692
Paul Kehrer7f8d9c02019-01-17 18:13:11 -0600693 :param key_material: The input key material.
694 :type key_material: :term:`bytes-like`
Jared6d7fe002016-05-29 17:32:37 -0700695 :return bytes: The derived key.
696 :raises TypeError: This exception is raised if ``key_material`` is
697 not ``bytes``.
698
699 Derives a new key from the input key material.
700
701 .. method:: verify(key_material, expected_key)
702
703 :param bytes key_material: The input key material. This is the same as
704 ``key_material`` in :meth:`derive`.
705 :param bytes expected_key: The expected result of deriving a new key,
706 this is the same as the return value of
707 :meth:`derive`.
708 :raises cryptography.exceptions.InvalidKey: This is raised when the
709 derived key does not match
710 the expected key.
711 :raises cryptography.exceptions.AlreadyFinalized: This is raised when
712 :meth:`derive` or
713 :meth:`verify` is
714 called more than
715 once.
716
717 This checks whether deriving a new key from the supplied
718 ``key_material`` generates the same key as the ``expected_key``, and
719 raises an exception if they do not match.
720
721.. class:: Mode
722
723 An enumeration for the key based key derivative modes.
724
725 .. attribute:: CounterMode
726
727 The output of the PRF is computed with a counter
728 as the iteration variable.
729
730.. class:: CounterLocation
731
732 An enumeration for the key based key derivative counter location.
733
734 .. attribute:: BeforeFixed
735
736 The counter iteration variable will be concatenated before
737 the fixed input data.
738
739 .. attribute:: AfterFixed
740
741 The counter iteration variable will be concatenated after
742 the fixed input data.
743
Terry Chiad8a27df2016-09-01 23:39:57 +0800744.. currentmodule:: cryptography.hazmat.primitives.kdf.scrypt
745
746.. class:: Scrypt(salt, length, n, r, p, backend)
747
748 .. versionadded:: 1.6
749
750 Scrypt is a KDF designed for password storage by Colin Percival to be
751 resistant against hardware-assisted attackers by having a tunable memory
752 cost. It is described in :rfc:`7914`.
753
754 This class conforms to the
755 :class:`~cryptography.hazmat.primitives.kdf.KeyDerivationFunction`
756 interface.
757
Paul Kehrerf12955c2017-06-07 02:20:33 -1000758 .. doctest::
Terry Chiad8a27df2016-09-01 23:39:57 +0800759
760 >>> import os
Terry Chiad8a27df2016-09-01 23:39:57 +0800761 >>> from cryptography.hazmat.primitives.kdf.scrypt import Scrypt
762 >>> from cryptography.hazmat.backends import default_backend
763 >>> backend = default_backend()
764 >>> salt = os.urandom(16)
765 >>> # derive
766 >>> kdf = Scrypt(
767 ... salt=salt,
Paul Kehrera857fe62017-06-28 23:03:29 -0500768 ... length=32,
Nick Badgeracaf89d2016-12-10 17:41:50 -0800769 ... n=2**14,
Terry Chiad8a27df2016-09-01 23:39:57 +0800770 ... r=8,
Nick Badgeracaf89d2016-12-10 17:41:50 -0800771 ... p=1,
Terry Chiad8a27df2016-09-01 23:39:57 +0800772 ... backend=backend
773 ... )
774 >>> key = kdf.derive(b"my great password")
775 >>> # verify
776 >>> kdf = Scrypt(
777 ... salt=salt,
Paul Kehrera857fe62017-06-28 23:03:29 -0500778 ... length=32,
Nick Badgeracaf89d2016-12-10 17:41:50 -0800779 ... n=2**14,
Terry Chiad8a27df2016-09-01 23:39:57 +0800780 ... r=8,
Nick Badgeracaf89d2016-12-10 17:41:50 -0800781 ... p=1,
Terry Chiad8a27df2016-09-01 23:39:57 +0800782 ... backend=backend
783 ... )
784 >>> kdf.verify(b"my great password", key)
785
786 :param bytes salt: A salt.
Paul Kehrera857fe62017-06-28 23:03:29 -0500787 :param int length: The desired length of the derived key in bytes.
Terry Chiad8a27df2016-09-01 23:39:57 +0800788 :param int n: CPU/Memory cost parameter. It must be larger than 1 and be a
789 power of 2.
790 :param int r: Block size parameter.
791 :param int p: Parallelization parameter.
792
793 The computational and memory cost of Scrypt can be adjusted by manipulating
Nick Badgeracaf89d2016-12-10 17:41:50 -0800794 the 3 parameters: ``n``, ``r``, and ``p``. In general, the memory cost of
795 Scrypt is affected by the values of both ``n`` and ``r``, while ``n`` also
796 determines the number of iterations performed. ``p`` increases the
797 computational cost without affecting memory usage. A more in-depth
798 explanation of the 3 parameters can be found `here`_.
Terry Chiad8a27df2016-09-01 23:39:57 +0800799
Nick Badgeracaf89d2016-12-10 17:41:50 -0800800 :rfc:`7914` `recommends`_ values of ``r=8`` and ``p=1`` while scaling ``n``
801 to a number appropriate for your system. `The scrypt paper`_ suggests a
802 minimum value of ``n=2**14`` for interactive logins (t < 100ms), or
803 ``n=2**20`` for more sensitive files (t < 5s).
Terry Chiad8a27df2016-09-01 23:39:57 +0800804
805 :param backend: An instance of
806 :class:`~cryptography.hazmat.backends.interfaces.ScryptBackend`.
807
808 :raises cryptography.exceptions.UnsupportedAlgorithm: This is raised if the
809 provided ``backend`` does not implement
810 :class:`~cryptography.hazmat.backends.interfaces.ScryptBackend`
811
812 :raises TypeError: This exception is raised if ``salt`` is not ``bytes``.
Terry Chiaa2d0da92016-09-03 07:57:45 +0800813 :raises ValueError: This exception is raised if ``n`` is less than 2, if
814 ``n`` is not a power of 2, if ``r`` is less than 1 or if ``p`` is less
815 than 1.
Terry Chiad8a27df2016-09-01 23:39:57 +0800816
817 .. method:: derive(key_material)
818
Paul Kehrera7799442019-01-17 15:56:23 -0600819 :param key_material: The input key material.
820 :type key_material: :term:`bytes-like`
Terry Chiad8a27df2016-09-01 23:39:57 +0800821 :return bytes: the derived key.
822 :raises TypeError: This exception is raised if ``key_material`` is not
823 ``bytes``.
824 :raises cryptography.exceptions.AlreadyFinalized: This is raised when
825 :meth:`derive` or
826 :meth:`verify` is
827 called more than
828 once.
829
830 This generates and returns a new key from the supplied password.
831
832 .. method:: verify(key_material, expected_key)
833
834 :param bytes key_material: The input key material. This is the same as
835 ``key_material`` in :meth:`derive`.
836 :param bytes expected_key: The expected result of deriving a new key,
837 this is the same as the return value of
838 :meth:`derive`.
839 :raises cryptography.exceptions.InvalidKey: This is raised when the
840 derived key does not match
841 the expected key.
842 :raises cryptography.exceptions.AlreadyFinalized: This is raised when
843 :meth:`derive` or
844 :meth:`verify` is
845 called more than
846 once.
847
848 This checks whether deriving a new key from the supplied
849 ``key_material`` generates the same key as the ``expected_key``, and
850 raises an exception if they do not match. This can be used for
851 checking whether the password a user provides matches the stored derived
852 key.
853
Paul Kehrer48402ff2015-02-16 15:31:52 -0600854Interface
855~~~~~~~~~
856
857.. currentmodule:: cryptography.hazmat.primitives.kdf
858
859.. class:: KeyDerivationFunction
860
861 .. versionadded:: 0.2
862
863 .. method:: derive(key_material)
864
865 :param bytes key_material: The input key material. Depending on what
866 key derivation function you are using this
867 could be either random bytes, or a user
868 supplied password.
869 :return: The new key.
870 :raises cryptography.exceptions.AlreadyFinalized: This is raised when
871 :meth:`derive` or
872 :meth:`verify` is
873 called more than
874 once.
875
876 This generates and returns a new key from the supplied key material.
877
878 .. method:: verify(key_material, expected_key)
879
880 :param bytes key_material: The input key material. This is the same as
881 ``key_material`` in :meth:`derive`.
882 :param bytes expected_key: The expected result of deriving a new key,
883 this is the same as the return value of
884 :meth:`derive`.
885 :raises cryptography.exceptions.InvalidKey: This is raised when the
886 derived key does not match
887 the expected key.
888 :raises cryptography.exceptions.AlreadyFinalized: This is raised when
889 :meth:`derive` or
890 :meth:`verify` is
891 called more than
892 once.
893
894 This checks whether deriving a new key from the supplied
895 ``key_material`` generates the same key as the ``expected_key``, and
896 raises an exception if they do not match. This can be used for
897 something like checking whether a user's password attempt matches the
898 stored derived key.
899
900
Cory Benfield9b22eb92017-05-22 22:40:40 -0700901.. [#nist] See `NIST SP 800-132`_.
902
Alex Gaynor53e45052017-09-20 09:57:47 -0400903.. _`NIST SP 800-132`: https://csrc.nist.gov/publications/detail/sp/800-132/final
904.. _`NIST SP 800-108`: https://csrc.nist.gov/publications/detail/sp/800-108/final
905.. _`NIST SP 800-56Ar2`: https://csrc.nist.gov/publications/detail/sp/800-56a/rev-2/final
Simo Sorce53c8f6a2015-09-15 11:13:56 -0400906.. _`ANSI X9.63:2001`: https://webstore.ansi.org
907.. _`SEC 1 v2.0`: http://www.secg.org/sec1-v2.pdf
Paul Kehrerb3f763f2014-01-28 16:42:15 -0600908.. _`Password Storage Cheat Sheet`: https://www.owasp.org/index.php/Password_Storage_Cheat_Sheet
David Reidb80deea2014-02-03 10:33:16 -0800909.. _`PBKDF2`: https://en.wikipedia.org/wiki/PBKDF2
David Reidb80deea2014-02-03 10:33:16 -0800910.. _`key stretching`: https://en.wikipedia.org/wiki/Key_stretching
Alex Gaynor2e8725d2016-08-29 21:40:19 -0400911.. _`HKDF`: https://en.wikipedia.org/wiki/HKDF
David Reidb80deea2014-02-03 10:33:16 -0800912.. _`HKDF paper`: https://eprint.iacr.org/2010/264
Terry Chiad8a27df2016-09-01 23:39:57 +0800913.. _`here`: https://stackoverflow.com/a/30308723/1170681
914.. _`recommends`: https://tools.ietf.org/html/rfc7914#section-2
Nick Badgeracaf89d2016-12-10 17:41:50 -0800915.. _`The scrypt paper`: https://www.tarsnap.com/scrypt/scrypt.pdf