1:mod:`hashlib` --- Secure hashes and message digests 2==================================================== 3 4.. module:: hashlib 5 :synopsis: Secure hash and message digest algorithms. 6 7.. moduleauthor:: Gregory P. Smith <greg@krypto.org> 8.. sectionauthor:: Gregory P. Smith <greg@krypto.org> 9 10**Source code:** :source:`Lib/hashlib.py` 11 12.. index:: 13 single: message digest, MD5 14 single: secure hash algorithm, SHA1, SHA224, SHA256, SHA384, SHA512 15 16.. testsetup:: 17 18 import hashlib 19 20 21-------------- 22 23This module implements a common interface to many different secure hash and 24message digest algorithms. Included are the FIPS secure hash algorithms SHA1, 25SHA224, SHA256, SHA384, and SHA512 (defined in FIPS 180-2) as well as RSA's MD5 26algorithm (defined in Internet :rfc:`1321`). The terms "secure hash" and 27"message digest" are interchangeable. Older algorithms were called message 28digests. The modern term is secure hash. 29 30.. note:: 31 32 If you want the adler32 or crc32 hash functions, they are available in 33 the :mod:`zlib` module. 34 35.. warning:: 36 37 Some algorithms have known hash collision weaknesses, refer to the "See 38 also" section at the end. 39 40 41.. _hash-algorithms: 42 43Hash algorithms 44--------------- 45 46There is one constructor method named for each type of :dfn:`hash`. All return 47a hash object with the same simple interface. For example: use :func:`sha256` to 48create a SHA-256 hash object. You can now feed this object with :term:`bytes-like 49objects <bytes-like object>` (normally :class:`bytes`) using the :meth:`update` method. 50At any point you can ask it for the :dfn:`digest` of the 51concatenation of the data fed to it so far using the :meth:`digest` or 52:meth:`hexdigest` methods. 53 54.. note:: 55 56 For better multithreading performance, the Python :term:`GIL` is released for 57 data larger than 2047 bytes at object creation or on update. 58 59.. note:: 60 61 Feeding string objects into :meth:`update` is not supported, as hashes work 62 on bytes, not on characters. 63 64.. index:: single: OpenSSL; (use in module hashlib) 65 66Constructors for hash algorithms that are always present in this module are 67:func:`sha1`, :func:`sha224`, :func:`sha256`, :func:`sha384`, 68:func:`sha512`, :func:`blake2b`, and :func:`blake2s`. 69:func:`md5` is normally available as well, though it 70may be missing or blocked if you are using a rare "FIPS compliant" build of Python. 71Additional algorithms may also be available depending upon the OpenSSL 72library that Python uses on your platform. On most platforms the 73:func:`sha3_224`, :func:`sha3_256`, :func:`sha3_384`, :func:`sha3_512`, 74:func:`shake_128`, :func:`shake_256` are also available. 75 76.. versionadded:: 3.6 77 SHA3 (Keccak) and SHAKE constructors :func:`sha3_224`, :func:`sha3_256`, 78 :func:`sha3_384`, :func:`sha3_512`, :func:`shake_128`, :func:`shake_256`. 79 80.. versionadded:: 3.6 81 :func:`blake2b` and :func:`blake2s` were added. 82 83.. versionchanged:: 3.9 84 All hashlib constructors take a keyword-only argument *usedforsecurity* 85 with default value ``True``. A false value allows the use of insecure and 86 blocked hashing algorithms in restricted environments. ``False`` indicates 87 that the hashing algorithm is not used in a security context, e.g. as a 88 non-cryptographic one-way compression function. 89 90 Hashlib now uses SHA3 and SHAKE from OpenSSL 1.1.1 and newer. 91 92For example, to obtain the digest of the byte string ``b'Nobody inspects the 93spammish repetition'``:: 94 95 >>> import hashlib 96 >>> m = hashlib.sha256() 97 >>> m.update(b"Nobody inspects") 98 >>> m.update(b" the spammish repetition") 99 >>> m.digest() 100 b'\x03\x1e\xdd}Ae\x15\x93\xc5\xfe\\\x00o\xa5u+7\xfd\xdf\xf7\xbcN\x84:\xa6\xaf\x0c\x95\x0fK\x94\x06' 101 >>> m.digest_size 102 32 103 >>> m.block_size 104 64 105 106More condensed: 107 108 >>> hashlib.sha224(b"Nobody inspects the spammish repetition").hexdigest() 109 'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2' 110 111.. function:: new(name[, data], *, usedforsecurity=True) 112 113 Is a generic constructor that takes the string *name* of the desired 114 algorithm as its first parameter. It also exists to allow access to the 115 above listed hashes as well as any other algorithms that your OpenSSL 116 library may offer. The named constructors are much faster than :func:`new` 117 and should be preferred. 118 119Using :func:`new` with an algorithm provided by OpenSSL: 120 121 >>> h = hashlib.new('ripemd160') 122 >>> h.update(b"Nobody inspects the spammish repetition") 123 >>> h.hexdigest() 124 'cc4a5ce1b3df48aec5d22d1f16b894a0b894eccc' 125 126Hashlib provides the following constant attributes: 127 128.. data:: algorithms_guaranteed 129 130 A set containing the names of the hash algorithms guaranteed to be supported 131 by this module on all platforms. Note that 'md5' is in this list despite 132 some upstream vendors offering an odd "FIPS compliant" Python build that 133 excludes it. 134 135 .. versionadded:: 3.2 136 137.. data:: algorithms_available 138 139 A set containing the names of the hash algorithms that are available in the 140 running Python interpreter. These names will be recognized when passed to 141 :func:`new`. :attr:`algorithms_guaranteed` will always be a subset. The 142 same algorithm may appear multiple times in this set under different names 143 (thanks to OpenSSL). 144 145 .. versionadded:: 3.2 146 147The following values are provided as constant attributes of the hash objects 148returned by the constructors: 149 150 151.. data:: hash.digest_size 152 153 The size of the resulting hash in bytes. 154 155.. data:: hash.block_size 156 157 The internal block size of the hash algorithm in bytes. 158 159A hash object has the following attributes: 160 161.. attribute:: hash.name 162 163 The canonical name of this hash, always lowercase and always suitable as a 164 parameter to :func:`new` to create another hash of this type. 165 166 .. versionchanged:: 3.4 167 The name attribute has been present in CPython since its inception, but 168 until Python 3.4 was not formally specified, so may not exist on some 169 platforms. 170 171A hash object has the following methods: 172 173 174.. method:: hash.update(data) 175 176 Update the hash object with the :term:`bytes-like object`. 177 Repeated calls are equivalent to a single call with the 178 concatenation of all the arguments: ``m.update(a); m.update(b)`` is 179 equivalent to ``m.update(a+b)``. 180 181 .. versionchanged:: 3.1 182 The Python GIL is released to allow other threads to run while hash 183 updates on data larger than 2047 bytes is taking place when using hash 184 algorithms supplied by OpenSSL. 185 186 187.. method:: hash.digest() 188 189 Return the digest of the data passed to the :meth:`update` method so far. 190 This is a bytes object of size :attr:`digest_size` which may contain bytes in 191 the whole range from 0 to 255. 192 193 194.. method:: hash.hexdigest() 195 196 Like :meth:`digest` except the digest is returned as a string object of 197 double length, containing only hexadecimal digits. This may be used to 198 exchange the value safely in email or other non-binary environments. 199 200 201.. method:: hash.copy() 202 203 Return a copy ("clone") of the hash object. This can be used to efficiently 204 compute the digests of data sharing a common initial substring. 205 206 207SHAKE variable length digests 208----------------------------- 209 210The :func:`shake_128` and :func:`shake_256` algorithms provide variable 211length digests with length_in_bits//2 up to 128 or 256 bits of security. 212As such, their digest methods require a length. Maximum length is not limited 213by the SHAKE algorithm. 214 215.. method:: shake.digest(length) 216 217 Return the digest of the data passed to the :meth:`update` method so far. 218 This is a bytes object of size *length* which may contain bytes in 219 the whole range from 0 to 255. 220 221 222.. method:: shake.hexdigest(length) 223 224 Like :meth:`digest` except the digest is returned as a string object of 225 double length, containing only hexadecimal digits. This may be used to 226 exchange the value safely in email or other non-binary environments. 227 228 229Key derivation 230-------------- 231 232Key derivation and key stretching algorithms are designed for secure password 233hashing. Naive algorithms such as ``sha1(password)`` are not resistant against 234brute-force attacks. A good password hashing function must be tunable, slow, and 235include a `salt <https://en.wikipedia.org/wiki/Salt_%28cryptography%29>`_. 236 237 238.. function:: pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None) 239 240 The function provides PKCS#5 password-based key derivation function 2. It 241 uses HMAC as pseudorandom function. 242 243 The string *hash_name* is the desired name of the hash digest algorithm for 244 HMAC, e.g. 'sha1' or 'sha256'. *password* and *salt* are interpreted as 245 buffers of bytes. Applications and libraries should limit *password* to 246 a sensible length (e.g. 1024). *salt* should be about 16 or more bytes from 247 a proper source, e.g. :func:`os.urandom`. 248 249 The number of *iterations* should be chosen based on the hash algorithm and 250 computing power. As of 2013, at least 100,000 iterations of SHA-256 are 251 suggested. 252 253 *dklen* is the length of the derived key. If *dklen* is ``None`` then the 254 digest size of the hash algorithm *hash_name* is used, e.g. 64 for SHA-512. 255 256 >>> import hashlib 257 >>> dk = hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 100000) 258 >>> dk.hex() 259 '0394a2ede332c9a13eb82e9b24631604c31df978b4e2f0fbd2c549944f9d79a5' 260 261 .. versionadded:: 3.4 262 263 .. note:: 264 265 A fast implementation of *pbkdf2_hmac* is available with OpenSSL. The 266 Python implementation uses an inline version of :mod:`hmac`. It is about 267 three times slower and doesn't release the GIL. 268 269.. function:: scrypt(password, *, salt, n, r, p, maxmem=0, dklen=64) 270 271 The function provides scrypt password-based key derivation function as 272 defined in :rfc:`7914`. 273 274 *password* and *salt* must be :term:`bytes-like objects 275 <bytes-like object>`. Applications and libraries should limit *password* 276 to a sensible length (e.g. 1024). *salt* should be about 16 or more 277 bytes from a proper source, e.g. :func:`os.urandom`. 278 279 *n* is the CPU/Memory cost factor, *r* the block size, *p* parallelization 280 factor and *maxmem* limits memory (OpenSSL 1.1.0 defaults to 32 MiB). 281 *dklen* is the length of the derived key. 282 283 .. availability:: OpenSSL 1.1+. 284 285 .. versionadded:: 3.6 286 287 288BLAKE2 289------ 290 291.. sectionauthor:: Dmitry Chestnykh 292 293.. index:: 294 single: blake2b, blake2s 295 296BLAKE2_ is a cryptographic hash function defined in :rfc:`7693` that comes in two 297flavors: 298 299* **BLAKE2b**, optimized for 64-bit platforms and produces digests of any size 300 between 1 and 64 bytes, 301 302* **BLAKE2s**, optimized for 8- to 32-bit platforms and produces digests of any 303 size between 1 and 32 bytes. 304 305BLAKE2 supports **keyed mode** (a faster and simpler replacement for HMAC_), 306**salted hashing**, **personalization**, and **tree hashing**. 307 308Hash objects from this module follow the API of standard library's 309:mod:`hashlib` objects. 310 311 312Creating hash objects 313^^^^^^^^^^^^^^^^^^^^^ 314 315New hash objects are created by calling constructor functions: 316 317 318.. function:: blake2b(data=b'', *, digest_size=64, key=b'', salt=b'', \ 319 person=b'', fanout=1, depth=1, leaf_size=0, node_offset=0, \ 320 node_depth=0, inner_size=0, last_node=False, \ 321 usedforsecurity=True) 322 323.. function:: blake2s(data=b'', *, digest_size=32, key=b'', salt=b'', \ 324 person=b'', fanout=1, depth=1, leaf_size=0, node_offset=0, \ 325 node_depth=0, inner_size=0, last_node=False, \ 326 usedforsecurity=True) 327 328 329These functions return the corresponding hash objects for calculating 330BLAKE2b or BLAKE2s. They optionally take these general parameters: 331 332* *data*: initial chunk of data to hash, which must be 333 :term:`bytes-like object`. It can be passed only as positional argument. 334 335* *digest_size*: size of output digest in bytes. 336 337* *key*: key for keyed hashing (up to 64 bytes for BLAKE2b, up to 32 bytes for 338 BLAKE2s). 339 340* *salt*: salt for randomized hashing (up to 16 bytes for BLAKE2b, up to 8 341 bytes for BLAKE2s). 342 343* *person*: personalization string (up to 16 bytes for BLAKE2b, up to 8 bytes 344 for BLAKE2s). 345 346The following table shows limits for general parameters (in bytes): 347 348======= =========== ======== ========= =========== 349Hash digest_size len(key) len(salt) len(person) 350======= =========== ======== ========= =========== 351BLAKE2b 64 64 16 16 352BLAKE2s 32 32 8 8 353======= =========== ======== ========= =========== 354 355.. note:: 356 357 BLAKE2 specification defines constant lengths for salt and personalization 358 parameters, however, for convenience, this implementation accepts byte 359 strings of any size up to the specified length. If the length of the 360 parameter is less than specified, it is padded with zeros, thus, for 361 example, ``b'salt'`` and ``b'salt\x00'`` is the same value. (This is not 362 the case for *key*.) 363 364These sizes are available as module `constants`_ described below. 365 366Constructor functions also accept the following tree hashing parameters: 367 368* *fanout*: fanout (0 to 255, 0 if unlimited, 1 in sequential mode). 369 370* *depth*: maximal depth of tree (1 to 255, 255 if unlimited, 1 in 371 sequential mode). 372 373* *leaf_size*: maximal byte length of leaf (0 to 2**32-1, 0 if unlimited or in 374 sequential mode). 375 376* *node_offset*: node offset (0 to 2**64-1 for BLAKE2b, 0 to 2**48-1 for 377 BLAKE2s, 0 for the first, leftmost, leaf, or in sequential mode). 378 379* *node_depth*: node depth (0 to 255, 0 for leaves, or in sequential mode). 380 381* *inner_size*: inner digest size (0 to 64 for BLAKE2b, 0 to 32 for 382 BLAKE2s, 0 in sequential mode). 383 384* *last_node*: boolean indicating whether the processed node is the last 385 one (`False` for sequential mode). 386 387.. figure:: hashlib-blake2-tree.png 388 :alt: Explanation of tree mode parameters. 389 390See section 2.10 in `BLAKE2 specification 391<https://blake2.net/blake2_20130129.pdf>`_ for comprehensive review of tree 392hashing. 393 394 395Constants 396^^^^^^^^^ 397 398.. data:: blake2b.SALT_SIZE 399.. data:: blake2s.SALT_SIZE 400 401Salt length (maximum length accepted by constructors). 402 403 404.. data:: blake2b.PERSON_SIZE 405.. data:: blake2s.PERSON_SIZE 406 407Personalization string length (maximum length accepted by constructors). 408 409 410.. data:: blake2b.MAX_KEY_SIZE 411.. data:: blake2s.MAX_KEY_SIZE 412 413Maximum key size. 414 415 416.. data:: blake2b.MAX_DIGEST_SIZE 417.. data:: blake2s.MAX_DIGEST_SIZE 418 419Maximum digest size that the hash function can output. 420 421 422Examples 423^^^^^^^^ 424 425Simple hashing 426"""""""""""""" 427 428To calculate hash of some data, you should first construct a hash object by 429calling the appropriate constructor function (:func:`blake2b` or 430:func:`blake2s`), then update it with the data by calling :meth:`update` on the 431object, and, finally, get the digest out of the object by calling 432:meth:`digest` (or :meth:`hexdigest` for hex-encoded string). 433 434 >>> from hashlib import blake2b 435 >>> h = blake2b() 436 >>> h.update(b'Hello world') 437 >>> h.hexdigest() 438 '6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183' 439 440 441As a shortcut, you can pass the first chunk of data to update directly to the 442constructor as the positional argument: 443 444 >>> from hashlib import blake2b 445 >>> blake2b(b'Hello world').hexdigest() 446 '6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183' 447 448You can call :meth:`hash.update` as many times as you need to iteratively 449update the hash: 450 451 >>> from hashlib import blake2b 452 >>> items = [b'Hello', b' ', b'world'] 453 >>> h = blake2b() 454 >>> for item in items: 455 ... h.update(item) 456 >>> h.hexdigest() 457 '6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183' 458 459 460Using different digest sizes 461"""""""""""""""""""""""""""" 462 463BLAKE2 has configurable size of digests up to 64 bytes for BLAKE2b and up to 32 464bytes for BLAKE2s. For example, to replace SHA-1 with BLAKE2b without changing 465the size of output, we can tell BLAKE2b to produce 20-byte digests: 466 467 >>> from hashlib import blake2b 468 >>> h = blake2b(digest_size=20) 469 >>> h.update(b'Replacing SHA1 with the more secure function') 470 >>> h.hexdigest() 471 'd24f26cf8de66472d58d4e1b1774b4c9158b1f4c' 472 >>> h.digest_size 473 20 474 >>> len(h.digest()) 475 20 476 477Hash objects with different digest sizes have completely different outputs 478(shorter hashes are *not* prefixes of longer hashes); BLAKE2b and BLAKE2s 479produce different outputs even if the output length is the same: 480 481 >>> from hashlib import blake2b, blake2s 482 >>> blake2b(digest_size=10).hexdigest() 483 '6fa1d8fcfd719046d762' 484 >>> blake2b(digest_size=11).hexdigest() 485 'eb6ec15daf9546254f0809' 486 >>> blake2s(digest_size=10).hexdigest() 487 '1bf21a98c78a1c376ae9' 488 >>> blake2s(digest_size=11).hexdigest() 489 '567004bf96e4a25773ebf4' 490 491 492Keyed hashing 493""""""""""""" 494 495Keyed hashing can be used for authentication as a faster and simpler 496replacement for `Hash-based message authentication code 497<https://en.wikipedia.org/wiki/Hash-based_message_authentication_code>`_ (HMAC). 498BLAKE2 can be securely used in prefix-MAC mode thanks to the 499indifferentiability property inherited from BLAKE. 500 501This example shows how to get a (hex-encoded) 128-bit authentication code for 502message ``b'message data'`` with key ``b'pseudorandom key'``:: 503 504 >>> from hashlib import blake2b 505 >>> h = blake2b(key=b'pseudorandom key', digest_size=16) 506 >>> h.update(b'message data') 507 >>> h.hexdigest() 508 '3d363ff7401e02026f4a4687d4863ced' 509 510 511As a practical example, a web application can symmetrically sign cookies sent 512to users and later verify them to make sure they weren't tampered with:: 513 514 >>> from hashlib import blake2b 515 >>> from hmac import compare_digest 516 >>> 517 >>> SECRET_KEY = b'pseudorandomly generated server secret key' 518 >>> AUTH_SIZE = 16 519 >>> 520 >>> def sign(cookie): 521 ... h = blake2b(digest_size=AUTH_SIZE, key=SECRET_KEY) 522 ... h.update(cookie) 523 ... return h.hexdigest().encode('utf-8') 524 >>> 525 >>> def verify(cookie, sig): 526 ... good_sig = sign(cookie) 527 ... return compare_digest(good_sig, sig) 528 >>> 529 >>> cookie = b'user-alice' 530 >>> sig = sign(cookie) 531 >>> print("{0},{1}".format(cookie.decode('utf-8'), sig)) 532 user-alice,b'43b3c982cf697e0c5ab22172d1ca7421' 533 >>> verify(cookie, sig) 534 True 535 >>> verify(b'user-bob', sig) 536 False 537 >>> verify(cookie, b'0102030405060708090a0b0c0d0e0f00') 538 False 539 540Even though there's a native keyed hashing mode, BLAKE2 can, of course, be used 541in HMAC construction with :mod:`hmac` module:: 542 543 >>> import hmac, hashlib 544 >>> m = hmac.new(b'secret key', digestmod=hashlib.blake2s) 545 >>> m.update(b'message') 546 >>> m.hexdigest() 547 'e3c8102868d28b5ff85fc35dda07329970d1a01e273c37481326fe0c861c8142' 548 549 550Randomized hashing 551"""""""""""""""""" 552 553By setting *salt* parameter users can introduce randomization to the hash 554function. Randomized hashing is useful for protecting against collision attacks 555on the hash function used in digital signatures. 556 557 Randomized hashing is designed for situations where one party, the message 558 preparer, generates all or part of a message to be signed by a second 559 party, the message signer. If the message preparer is able to find 560 cryptographic hash function collisions (i.e., two messages producing the 561 same hash value), then they might prepare meaningful versions of the message 562 that would produce the same hash value and digital signature, but with 563 different results (e.g., transferring $1,000,000 to an account, rather than 564 $10). Cryptographic hash functions have been designed with collision 565 resistance as a major goal, but the current concentration on attacking 566 cryptographic hash functions may result in a given cryptographic hash 567 function providing less collision resistance than expected. Randomized 568 hashing offers the signer additional protection by reducing the likelihood 569 that a preparer can generate two or more messages that ultimately yield the 570 same hash value during the digital signature generation process --- even if 571 it is practical to find collisions for the hash function. However, the use 572 of randomized hashing may reduce the amount of security provided by a 573 digital signature when all portions of the message are prepared 574 by the signer. 575 576 (`NIST SP-800-106 "Randomized Hashing for Digital Signatures" 577 <https://csrc.nist.gov/publications/detail/sp/800-106/final>`_) 578 579In BLAKE2 the salt is processed as a one-time input to the hash function during 580initialization, rather than as an input to each compression function. 581 582.. warning:: 583 584 *Salted hashing* (or just hashing) with BLAKE2 or any other general-purpose 585 cryptographic hash function, such as SHA-256, is not suitable for hashing 586 passwords. See `BLAKE2 FAQ <https://blake2.net/#qa>`_ for more 587 information. 588.. 589 590 >>> import os 591 >>> from hashlib import blake2b 592 >>> msg = b'some message' 593 >>> # Calculate the first hash with a random salt. 594 >>> salt1 = os.urandom(blake2b.SALT_SIZE) 595 >>> h1 = blake2b(salt=salt1) 596 >>> h1.update(msg) 597 >>> # Calculate the second hash with a different random salt. 598 >>> salt2 = os.urandom(blake2b.SALT_SIZE) 599 >>> h2 = blake2b(salt=salt2) 600 >>> h2.update(msg) 601 >>> # The digests are different. 602 >>> h1.digest() != h2.digest() 603 True 604 605 606Personalization 607""""""""""""""" 608 609Sometimes it is useful to force hash function to produce different digests for 610the same input for different purposes. Quoting the authors of the Skein hash 611function: 612 613 We recommend that all application designers seriously consider doing this; 614 we have seen many protocols where a hash that is computed in one part of 615 the protocol can be used in an entirely different part because two hash 616 computations were done on similar or related data, and the attacker can 617 force the application to make the hash inputs the same. Personalizing each 618 hash function used in the protocol summarily stops this type of attack. 619 620 (`The Skein Hash Function Family 621 <http://www.skein-hash.info/sites/default/files/skein1.3.pdf>`_, 622 p. 21) 623 624BLAKE2 can be personalized by passing bytes to the *person* argument:: 625 626 >>> from hashlib import blake2b 627 >>> FILES_HASH_PERSON = b'MyApp Files Hash' 628 >>> BLOCK_HASH_PERSON = b'MyApp Block Hash' 629 >>> h = blake2b(digest_size=32, person=FILES_HASH_PERSON) 630 >>> h.update(b'the same content') 631 >>> h.hexdigest() 632 '20d9cd024d4fb086aae819a1432dd2466de12947831b75c5a30cf2676095d3b4' 633 >>> h = blake2b(digest_size=32, person=BLOCK_HASH_PERSON) 634 >>> h.update(b'the same content') 635 >>> h.hexdigest() 636 'cf68fb5761b9c44e7878bfb2c4c9aea52264a80b75005e65619778de59f383a3' 637 638Personalization together with the keyed mode can also be used to derive different 639keys from a single one. 640 641 >>> from hashlib import blake2s 642 >>> from base64 import b64decode, b64encode 643 >>> orig_key = b64decode(b'Rm5EPJai72qcK3RGBpW3vPNfZy5OZothY+kHY6h21KM=') 644 >>> enc_key = blake2s(key=orig_key, person=b'kEncrypt').digest() 645 >>> mac_key = blake2s(key=orig_key, person=b'kMAC').digest() 646 >>> print(b64encode(enc_key).decode('utf-8')) 647 rbPb15S/Z9t+agffno5wuhB77VbRi6F9Iv2qIxU7WHw= 648 >>> print(b64encode(mac_key).decode('utf-8')) 649 G9GtHFE1YluXY1zWPlYk1e/nWfu0WSEb0KRcjhDeP/o= 650 651Tree mode 652""""""""" 653 654Here's an example of hashing a minimal tree with two leaf nodes:: 655 656 10 657 / \ 658 00 01 659 660This example uses 64-byte internal digests, and returns the 32-byte final 661digest:: 662 663 >>> from hashlib import blake2b 664 >>> 665 >>> FANOUT = 2 666 >>> DEPTH = 2 667 >>> LEAF_SIZE = 4096 668 >>> INNER_SIZE = 64 669 >>> 670 >>> buf = bytearray(6000) 671 >>> 672 >>> # Left leaf 673 ... h00 = blake2b(buf[0:LEAF_SIZE], fanout=FANOUT, depth=DEPTH, 674 ... leaf_size=LEAF_SIZE, inner_size=INNER_SIZE, 675 ... node_offset=0, node_depth=0, last_node=False) 676 >>> # Right leaf 677 ... h01 = blake2b(buf[LEAF_SIZE:], fanout=FANOUT, depth=DEPTH, 678 ... leaf_size=LEAF_SIZE, inner_size=INNER_SIZE, 679 ... node_offset=1, node_depth=0, last_node=True) 680 >>> # Root node 681 ... h10 = blake2b(digest_size=32, fanout=FANOUT, depth=DEPTH, 682 ... leaf_size=LEAF_SIZE, inner_size=INNER_SIZE, 683 ... node_offset=0, node_depth=1, last_node=True) 684 >>> h10.update(h00.digest()) 685 >>> h10.update(h01.digest()) 686 >>> h10.hexdigest() 687 '3ad2a9b37c6070e374c7a8c508fe20ca86b6ed54e286e93a0318e95e881db5aa' 688 689Credits 690^^^^^^^ 691 692BLAKE2_ was designed by *Jean-Philippe Aumasson*, *Samuel Neves*, *Zooko 693Wilcox-O'Hearn*, and *Christian Winnerlein* based on SHA-3_ finalist BLAKE_ 694created by *Jean-Philippe Aumasson*, *Luca Henzen*, *Willi Meier*, and 695*Raphael C.-W. Phan*. 696 697It uses core algorithm from ChaCha_ cipher designed by *Daniel J. Bernstein*. 698 699The stdlib implementation is based on pyblake2_ module. It was written by 700*Dmitry Chestnykh* based on C implementation written by *Samuel Neves*. The 701documentation was copied from pyblake2_ and written by *Dmitry Chestnykh*. 702 703The C code was partly rewritten for Python by *Christian Heimes*. 704 705The following public domain dedication applies for both C hash function 706implementation, extension code, and this documentation: 707 708 To the extent possible under law, the author(s) have dedicated all copyright 709 and related and neighboring rights to this software to the public domain 710 worldwide. This software is distributed without any warranty. 711 712 You should have received a copy of the CC0 Public Domain Dedication along 713 with this software. If not, see 714 https://creativecommons.org/publicdomain/zero/1.0/. 715 716The following people have helped with development or contributed their changes 717to the project and the public domain according to the Creative Commons Public 718Domain Dedication 1.0 Universal: 719 720* *Alexandr Sokolovskiy* 721 722.. _BLAKE2: https://blake2.net 723.. _HMAC: https://en.wikipedia.org/wiki/Hash-based_message_authentication_code 724.. _BLAKE: https://131002.net/blake/ 725.. _SHA-3: https://en.wikipedia.org/wiki/NIST_hash_function_competition 726.. _ChaCha: https://cr.yp.to/chacha.html 727.. _pyblake2: https://pythonhosted.org/pyblake2/ 728 729 730 731.. seealso:: 732 733 Module :mod:`hmac` 734 A module to generate message authentication codes using hashes. 735 736 Module :mod:`base64` 737 Another way to encode binary hashes for non-binary environments. 738 739 https://blake2.net 740 Official BLAKE2 website. 741 742 https://csrc.nist.gov/csrc/media/publications/fips/180/2/archive/2002-08-01/documents/fips180-2.pdf 743 The FIPS 180-2 publication on Secure Hash Algorithms. 744 745 https://en.wikipedia.org/wiki/Cryptographic_hash_function#Cryptographic_hash_algorithms 746 Wikipedia article with information on which algorithms have known issues and 747 what that means regarding their use. 748 749 https://www.ietf.org/rfc/rfc2898.txt 750 PKCS #5: Password-Based Cryptography Specification Version 2.0 751