Автор оригинала: Doug Hellmann.
Цель:
Криптографические хэши и дайджесты сообщений
Модуль hashlib
определяет API для доступа к различным алгоритмам криптографического хеширования. Для работы с определенным алгоритмом хеширования используйте соответствующую функцию-конструктор или new ()
для создания хеш-объекта. Оттуда объекты используют один и тот же API, независимо от того, какой алгоритм используется.
Хеш-алгоритмы
Поскольку hashlib
“поддерживается” OpenSSL, доступны все алгоритмы, предоставляемые этой библиотекой, в том числе:
- мкр5
- sha1
- sha224
- Sha256
- sha384
- Sha512
Некоторые алгоритмы доступны на всех платформах, а некоторые зависят от базовых библиотек. Списки каждого из них см. В разделах гарантировано_алгоритмов
и доступно_алгоритмов
соответственно.
hashlib_algorithms.py
import hashlib print('Guaranteed:\n{}\n'.format( ', '.join(sorted(hashlib.algorithms_guaranteed)))) print('Available:\n{}'.format( ', '.join(sorted(hashlib.algorithms_available))))
$ python3 hashlib_algorithms.py Guaranteed: blake2b, blake2s, md5, sha1, sha224, sha256, sha384, sha3_224, sha3_256, sha3_384, sha3_512, sha512, shake_128, shake_256 Available: BLAKE2b512, BLAKE2s256, MD4, MD5, MD5-SHA1, RIPEMD160, SHA1, SHA224, SHA256, SHA384, SHA512, blake2b, blake2b512, blake2s, blake2s256, md4, md5, md5-sha1, ripemd160, sha1, sha224, sha256, sha384, sha3_224, sha3_256, sha3_384, sha3_512, sha512, shake_128, shake_256, whirlpool
Пример данных
Все примеры в этом разделе используют одни и те же образцы данных:
hashlib_data.py
import hashlib lorem '''Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'''
Пример MD5
Чтобы вычислить хэш MD5 или дайджест для блока данных (здесь строка Unicode, преобразованная в байтовую строку), сначала создайте хэш-объект, затем добавьте данные и вызовите digest ( )
или hexdigest ()
.
hashlib_md5.py
import hashlib from hashlib_data import lorem h hashlib.md5() h.update(lorem.encode('utf-8')) print(h.hexdigest())
В этом примере используется метод hexdigest ()
вместо digest ()
, поскольку выходные данные отформатированы для четкой печати. Если значение двоичного дайджеста допустимо, используйте digest ()
.
$ python3 hashlib_md5.py 3f2fd2c9e25d60fb0fa5d593b802b7a8
Пример SHA1
Таким же образом рассчитывается дайджест SHA1.
hashlib_sha1.py
import hashlib from hashlib_data import lorem h hashlib.sha1() h.update(lorem.encode('utf-8')) print(h.hexdigest())
Значение дайджеста в этом примере отличается, поскольку алгоритм изменился с MD5 на SHA1.
$ python3 hashlib_sha1.py ea360b288b3dd178fe2625f55b2959bf1dba6eef
Создание хеша по имени
Иногда удобнее ссылаться на алгоритм по имени в строке, чем напрямую использовать функцию-конструктор. Например, полезно иметь возможность хранить тип хэша в файле конфигурации. В таких случаях используйте new ()
для создания хеш-калькулятора.
hashlib_new.py
import argparse import hashlib import sys from hashlib_data import lorem parser argparse.ArgumentParser('hashlib demo') parser.add_argument( 'hash_name', choiceshashlib.algorithms_available, help'the name of the hash algorithm to use', ) parser.add_argument( 'data', nargs'?', defaultlorem, help'the input data to hash, defaults to lorem ipsum', ) args parser.parse_args() h hashlib.new(args.hash_name) h.update(args.data.encode('utf-8')) print(h.hexdigest())
При запуске с множеством аргументов:
$ python3 hashlib_new.py sha1 ea360b288b3dd178fe2625f55b2959bf1dba6eef $ python3 hashlib_new.py sha256 3c887cc71c67949df29568119cc646f46b9cd2c2b39d456065646bc2fc09ffd8 $ python3 hashlib_new.py sha512 a7e53384eb9bb4251a19571450465d51809e0b7046101b87c4faef96b9bc904cf7f90 035f444952dfd9f6084eeee2457433f3ade614712f42f80960b2fca43ff $ python3 hashlib_new.py md5 3f2fd2c9e25d60fb0fa5d593b802b7a8
Дополнительные обновления
Метод хеш-калькуляторов update ()
можно вызывать повторно. Каждый раз дайджест обновляется на основе введенного дополнительного текста. Постепенное обновление более эффективно, чем чтение всего файла в память, и дает те же результаты.
hashlib_update.py
import hashlib from hashlib_data import lorem h hashlib.md5() h.update(lorem.encode('utf-8')) all_at_once h.hexdigest() def chunkize(size, text): "Return parts of the text in size-based increments." start 0 while start < len(text): chunk text[start:start + size] yield chunk start size return h hashlib.md5() for chunk in chunkize(64, lorem.encode('utf-8')): h.update(chunk) line_by_line h.hexdigest() print('All at once :', all_at_once) print('Line by line:', line_by_line) print('Same :', (all_at_once line_by_line))
В этом примере показано, как постепенно обновлять дайджест по мере чтения или создания данных.
$ python3 hashlib_update.py All at once : 3f2fd2c9e25d60fb0fa5d593b802b7a8 Line by line: 3f2fd2c9e25d60fb0fa5d593b802b7a8 Same : True
Смотрите также
- стандартная библиотечная документация для hashlib
- hmac – модуль
hmac
. - OpenSSL – набор инструментов для шифрования с открытым исходным кодом.
- Модуль криптографии – пакет Python, который предоставляет криптографические рецепты и примитивы.
- Voidspace: IronPython и hashlib – оболочка для
hashlib
, которая работает с IronPython.