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