hashlib — хеширование строк в Python на примерах — MD5, SHA1

МЕНЮ


Искусственный интеллект
Поиск
Регистрация на сайте
Помощь проекту

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


В Python хеш-функция принимает вводную последовательность с переменной длиной в байтах и конвертирует ее в последовательность с фиксированной длиной. Данная функция односторонняя.

Содержание статьи

  • Что такое хеш-функция Python
  • Популярные хеш-функции Python
  • Примеры кода с хеш-функциями в Python
  • MD5 — пример хеширования
  • SHA1 — пример хеширования
  • Хеширование на SHA224
  • Хеширование на SHA256
  • Пример хеширования на SHA384
  • Пример хеширования на SHA512
  • Использование алгоритмов OpenSSL
  • Реальный пример хеширования паролей Python

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

Что такое хеш-функция Python

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

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

Мы собрали ТОП Книг для Python программиста которые помогут быстро изучить язык программирования Python. Список книг: Книги по Python

Обратите внимание, что хеш-функции не являются криптографическим протоколом, они не шифруют и не дешифруют информацию, но являются фундаментальной частью многих криптографических протоколов и инструментов.

Популярные хеш-функции Python

Некоторые часто используемые хеш-функции:

  • MD5: Алгоритм производит хеш со значением в 128 битов. Широко используется для проверки целостности данных. Не подходит для использования в иных областях по причине уязвимости в безопасности MD5.
  • SHA: Группа алгоритмов, что были разработаны NSA Соединенных Штатов. Они являются частью Федерального стандарта обработки информации США. Эти алгоритмы широко используются в нескольких криптографических приложениях. Длина сообщения варьируется от 160 до 512 бит.

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

Данный код предназначен для работы в Python 3.5 и выше. При желании запустить эти примеры в Python 2.x, просто удалите вызовы attributems_available и algorithms_guaranteed.

Сначала импортируется модуль hashlib:

Python

1

importhashlib

Теперь для списка доступных алгоритмов используются algorithms_available и algorithms_guaranteed.

Python

1

2

print(hashlib.algorithms_available)

print(hashlib.algorithms_guaranteed)

Метод algorithms_available создает список всех алгоритмов, доступных в системе, включая те, что доступны через OpenSSl. В данном случае в списке можно заметить дубликаты названий. algorithms_guaranteed перечисляет только алгоритмы модуля. Всегда присутствуют md5, sha1, sha224, sha256, sha384, sha512.

Примеры кода с хеш-функциями в Python

Код ниже принимает строку "Hello World" и выводит дайджест HEX данной строки. hexdigest возвращает строку HEX, что представляет хеш, и в случае, если вам нужна последовательность байтов, нужно использовать дайджест.

MD5 — пример хеширования

Python

1

2

3

4

importhashlib

hash_object=hashlib.md5(b'Hello World')

print(hash_object.hexdigest())

Обратите внимание, что "b" предшествует литералу строки, происходит конвертация строки в байты, оттого, что функция хеширования принимает только последовательность байтов в качестве параметра. В предыдущей версии библиотеки принимался литерал строки.

Итак, если вам нужно принять какой-то ввод с консоли и хешировать его, не забудьте закодировать строку в последовательности байтов:

Python

1

2

3

4

5

6

7

importhashlib

mystring=input('Enter String to hash: ')

# Предположительно по умолчанию UTF-8

hash_object=hashlib.md5(mystring.encode())

print(hash_object.hexdigest())

Предположим, нам нужно хешировать строку "Hello Word" с помощью функции MD5. Тогда результатом будет 0a4d55a8d778e5022fab701977c5d840bbc486d0.

SHA1 — пример хеширования

Python

1

2

3

4

5

6

importhashlib

hash_object=hashlib.sha1(b'Hello World')

hex_dig=hash_object.hexdigest()

print(hex_dig)

Хеширование на SHA224

Python

1

2

3

4

5

6

importhashlib

hash_object=hashlib.sha224(b'Hello World')

hex_dig=hash_object.hexdigest()

print(hex_dig)

Хеширование на SHA256

Python

1

2

3

4

5

6

importhashlib

hash_object=hashlib.sha256(b'Hello World')

hex_dig=hash_object.hexdigest()

print(hex_dig)

Пример хеширования на SHA384

Python

1

2

3

4

5

6

importhashlib

hash_object=hashlib.sha384(b'Hello World')

hex_dig=hash_object.hexdigest()

print(hex_dig)

Пример хеширования на SHA512

Python

1

2

3

4

5

6

importhashlib

hash_object=hashlib.sha512(b'Hello World')

hex_dig=hash_object.hexdigest()

print(hex_dig)

Использование алгоритмов OpenSSL

Предположим, вам нужен алгоритм, предоставленный OpenSSL. Используя algorithms_available, можно найти название необходимого алгоритма.

В данном случае,  на моем компьютере доступен «DSA». Вы можете использовать методы new и update:

Python

1

2

3

4

5

6

importhashlib

hash_object=hashlib.new('DSA')

hash_object.update(b'Hello World')

print(hash_object.hexdigest())

Реальный пример хеширования паролей Python

В следующем примере пароли будут хешироваться для последующего сохранения в базе данных. Здесь мы будем использовать salt. salt является случайной последовательностью, добавленной к строке пароля перед использованием хеш-функции. salt используется для предотвращения перебора по словарю (dictionary attack) и атак радужной таблицы (rainbow tables attacks).

Тем не менее, если вы занимаетесь реально функционирующим приложением и работаете над паролями пользователей, следите за последними зафиксированными уязвимостями в данной области. Для более подробного ознакомления с темой защиты паролей можете просмотреть следующую статью.

Код для Python 3.x

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

importuuid

importhashlib

defhash_password(password):

# uuid используется для генерации случайного числа

salt=uuid.uuid4().hex

returnhashlib.sha256(salt.encode()+password.encode()).hexdigest()+':'+salt

defcheck_password(hashed_password,user_password):

password,salt=hashed_password.split(':')

returnpassword==hashlib.sha256(salt.encode()+user_password.encode()).hexdigest()

new_pass=input('Введите пароль: ')

hashed_password=hash_password(new_pass)

print('Строка для хранения в базе данных: '+hashed_password)

old_pass=input('Введите пароль еще раз для проверки: ')

ifcheck_password(hashed_password,old_pass):

print('Вы ввели правильный пароль')

else:

print('Извините, но пароли не совпадают')

Код для Python 2.x

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

importuuid

importhashlib

defhash_password(password):

# uuid используется для генерации случайного числа

salt=uuid.uuid4().hex

returnhashlib.sha256(salt.encode()+password.encode()).hexdigest()+':'+salt

defcheck_password(hashed_password,user_password):

password,salt=hashed_password.split(':')

returnpassword==hashlib.sha256(salt.encode()+user_password.encode()).hexdigest()

new_pass=raw_input('Введите пароль: ')

hashed_password=hash_password(new_pass)

print('Строка для сохранения в базе данных: '+hashed_password)

old_pass=raw_input('Введите пароль еще раз для проверки: ')

ifcheck_password(hashed_password,old_pass):

print('Вы ввели правильный пароль')

else:

print('Извините, но пароли не совпадают')


Источник: python-scripts.com

Комментарии: