Рубрики
Без рубрики

hashlib – криптографическое хеширование

Автор оригинала: 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

Смотрите также