MD5-хэш в Python

  1. Что такое хеш?
  2. Что такое MD5?
  3. Модуль Python hashlib
  4. Используйте алгоритм MD5 в Python

В этой статье будет продемонстрировано, как использовать хеш MD5 с помощью модуля Python hashlib.

Что такое хеш?

Хеш - это функция, которая принимает данные переменной длины и преобразует их в фиксированную длину. Значение, возвращаемое хеш-функцией, называется хеш-значением, хеш-кодом или дайджестом. Хеш-значения обычно используются для индексации таблицы фиксированного размера, называемой хеш-таблицей.

Что такое MD5?

Алгоритм дайджеста сообщения MD5 - это популярная хеш-функция, которая выдает 128-битное хеш-значение. Первоначально разработанный как криптографическая хеш-функция, теперь он обычно используется для проверки целостности данных из-за множества проблем безопасности и уязвимостей.

Модуль Python hashlib

Стандартная библиотека Python состоит из модуля, который реализует множество различных алгоритмов безопасного хеширования и дайджеста сообщений, называемых hashlib. Он также может включать дополнительные алгоритмы, доступные в зависимости от библиотеки OpenSSL, которую Python использует на вашей платформе.

Чтобы использовать алгоритмы хеширования, импортируйте модуль hashlib.

import hashlib

Теперь мы можем использовать алгоритмы хеширования, поддерживаемые этим модулем. Чтобы проверить доступные хеш-алгоритмы в работающем интерпретаторе Python, используйте постоянный атрибут algorithmms_available.

import hashlib

print(hashlib.algorithms_available)

Выход:

{'md5', 'blake2s', 'sha256', 'sha384', 'sha3_512', 'blake2b', 'md4', 'md5-sha1', 'sha512_224', 'sha224', 'sha3_224', 'ripemd160', 'sha3_256', 'shake_256', 'sm3', 'shake_128', 'sha3_384', 'sha1', 'sha512_256', 'whirlpool', 'sha512'}

В списке выше представлены доступные алгоритмы в hashlib, включая доступные алгоритмы OpenSSL.

Чтобы проверить, какие алгоритмы хеширования гарантированно поддерживаются этим модулем на всех платформах, используйте постоянный атрибут algorithmms_guaranteed.

import hashlib

print(hashlib.algorithms_guaranteed)

Выход:

{'sha3_256', 'sha256', 'sha3_224', 'sha224', 'blake2s', 'sha3_512', 'shake_128', 'sha512', 'sha3_384', 'shake_256', 'md5', 'blake2b', 'sha384', 'sha1'}

Примечание: md5 находится в списке алгоритмов_гарантия, но некоторые совместимые с FIPS поставщики апстрима предлагают сборку Python, исключающую его.

Используйте алгоритм MD5 в Python

Чтобы использовать алгоритм md5, мы воспользуемся конструктором md5() и загрузим хэш-объект байтовыми объектами с помощью метода update() или передадим данные в качестве параметра конструктора.

Для получения хеш-значения используйте метод digest(), который возвращает байтовый дайджест данных, переданных в хеш-объект.

import hashlib

md5_hash = hashlib.md5()
md5_hash.update(b'Hello World')

print(md5_hash.digest())

Выход:

b'\xb1\n\x8d\xb1d\xe0uA\x05\xb7\xa9\x9b\xe7.?\xe5'

Вы также можете передать данные в качестве параметра конструктору и получить хеш-значение.

import hashlib

print(hashlib.md5(b'Hello World').digest())

Выход:

b'\xb1\n\x8d\xb1d\xe0uA\x05\xb7\xa9\x9b\xe7.?\xe5'

Подобно методу digest(), вы также можете использовать hexdigest(), который возвращает строковый объект дайджеста, содержащий только шестнадцатеричные цифры.

import hashlib

md5_hash = hashlib.md5()
md5_hash.update(b'Hello World')

print(md5_hash.hexdigest())

Выход:

b10a8db164e0754105b7a99be72e3fe5

Обратите внимание, что перед строковым литералом, переданным в метод update(), стоит буква b. Используется для создания экземпляра типа bytes вместо типа str. Поскольку функция хеширования принимает в качестве параметра только последовательность байтов. Передача строковых объектов в метод update() не поддерживается.

Вы также можете выполнить несколько вызовов метода update(), что эквивалентно одному вызову со всеми объединенными аргументами.

import hashlib

first_hash = hashlib.md5()
first_hash.update(b'Hello World, Hello Python')
print(first_hash.hexdigest())

second_hash = hashlib.md5()
second_hash.update(b'Hello World,')
second_hash.update(b' Hello Python')
print(second_hash.hexdigest())

Выход:

b0f2921c8c0e63898b0388777908893a
b0f2921c8c0e63898b0388777908893a

Таким образом, мы можем использовать алгоритм хеширования md5 через модуль hashlib, в который можно загружать данные, передавая их в качестве параметра конструктора md5() или используя метод update(). Мы можем получить хеш-значение с помощью метода digest(), который возвращает объект bytes метода digest() или hexdigest(), который возвращает строковый объект дайджеста, содержащий только шестнадцатеричные цифры.