В Python хеш-функция принимает вводную последовательность с переменной длиной в байтах и конвертирует ее в последовательность с фиксированной длиной. Данная функция односторонняя.
Содержание статьи
- Что такое хеш-функция Python
- Популярные хеш-функции Python
- Примеры кода с хеш-функциями в Python
- MD5 — пример хеширования
- SHA1 — пример хеширования
- Хеширование на SHA224
- Хеширование на SHA256
- Пример хеширования на SHA384
- Пример хеширования на SHA512
- Использование алгоритмов OpenSSL
- Реальный пример хеширования паролей Python
Это значит, что если f
является функцией хеширования, f(x)
вычисляется довольно быстро и без лишних сложностей, однако на повторное получение х
потребуется очень много времени. Значение, что возвращается хеш-функцией, обычно называют хешем, дайджестом сообщения, значением хеша или контрольной суммой. В подобающем большинстве случаев для предоставленного ввода хеш-функция создает уникальный вывод. Однако, в зависимости от алгоритма, есть вероятность возникновения конфликта, вызванного особенностями математических теорий, что лежат в основе этих функций.
Что такое хеш-функция Python
Хеш-функции используются в криптографических алгоритмах, электронных подписях, кодах аутентификации сообщений, обнаружении манипуляций, сканировании отпечатков пальцев, контрольных суммах (проверка целостности сообщений), хеш-таблицах, хранении паролей и многом другом.
Как Python-разработчику, вам могут понадобиться эти функции для проверки дубликатов данных и файлов, проверки целостности данных при передаче информации по сети, безопасного хранения паролей в базах данных или, возможно, для какой-либо работы, связанной с криптографией.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Паблик VK
Одно из самых больших сообществ по 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
:
1 |
import hashlib |
Теперь для списка доступных алгоритмов используются algorithms_available
и algorithms_guaranteed
.
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 — пример хеширования
1 2 3 4 |
import hashlib hash_object = hashlib.md5(b'Hello World') print(hash_object.hexdigest()) |
Обратите внимание, что "b"
предшествует литералу строки, происходит конвертация строки в байты, оттого, что функция хеширования принимает только последовательность байтов в качестве параметра. В предыдущей версии библиотеки принимался литерал строки.
Итак, если вам нужно принять какой-то ввод с консоли и хешировать его, не забудьте закодировать строку в последовательности байтов:
1 2 3 4 5 6 7 |
import hashlib mystring = input('Enter String to hash: ') # Предположительно по умолчанию UTF-8 hash_object = hashlib.md5(mystring.encode()) print(hash_object.hexdigest()) |
Предположим, нам нужно хешировать строку "Hello Word"
с помощью функции MD5
. Тогда результатом будет 0a4d55a8d778e5022fab701977c5d840bbc486d0
.
SHA1 — пример хеширования
1 2 3 4 5 6 |
import hashlib hash_object = hashlib.sha1(b'Hello World') hex_dig = hash_object.hexdigest() print(hex_dig) |
Хеширование на SHA224
1 2 3 4 5 6 |
import hashlib hash_object = hashlib.sha224(b'Hello World') hex_dig = hash_object.hexdigest() print(hex_dig) |
Хеширование на SHA256
1 2 3 4 5 6 |
import hashlib hash_object = hashlib.sha256(b'Hello World') hex_dig = hash_object.hexdigest() print(hex_dig) |
Пример хеширования на SHA384
1 2 3 4 5 6 |
import hashlib hash_object = hashlib.sha384(b'Hello World') hex_dig = hash_object.hexdigest() print(hex_dig) |
Пример хеширования на SHA512
1 2 3 4 5 6 |
import hashlib hash_object = hashlib.sha512(b'Hello World') hex_dig = hash_object.hexdigest() print(hex_dig) |
Использование алгоритмов OpenSSL
Предположим, вам нужен алгоритм, предоставленный OpenSSL. Используя algorithms_available
, можно найти название необходимого алгоритма.
В данном случае, на моем компьютере доступен «DSA». Вы можете использовать методы new
и update
:
1 2 3 4 5 6 |
import hashlib 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import uuid import hashlib def hash_password(password): # uuid используется для генерации случайного числа salt = uuid.uuid4().hex return hashlib.sha256(salt.encode() + password.encode()).hexdigest() + ':' + salt def check_password(hashed_password, user_password): password, salt = hashed_password.split(':') return password == hashlib.sha256(salt.encode() + user_password.encode()).hexdigest() new_pass = input('Введите пароль: ') hashed_password = hash_password(new_pass) print('Строка для хранения в базе данных: ' + hashed_password) old_pass = input('Введите пароль еще раз для проверки: ') if check_password(hashed_password, old_pass): print('Вы ввели правильный пароль') else: print('Извините, но пароли не совпадают') |
Код для Python 2.x
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import uuid import hashlib def hash_password(password): # uuid используется для генерации случайного числа salt = uuid.uuid4().hex return hashlib.sha256(salt.encode() + password.encode()).hexdigest() + ':' + salt def check_password(hashed_password, user_password): password, salt = hashed_password.split(':') return password == 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('Введите пароль еще раз для проверки: ') if check_password(hashed_password, old_pass): print('Вы ввели правильный пароль') else: print('Извините, но пароли не совпадают') |
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»