Средства шифрования в Python.

В Python не так уж много инструментов стандартной библиотеки, которые работают с шифрованием. В данной статье мы рассмотрим несколько библиотек для шифрования и научимся шифровать и расшифровывать строки.

1. Хеширование

Если вам нужно шифровать пароли, то для этого подойдет модуль стандартной библиотеки Python hashlib.

Он включает в себя безопасные алгоритмы хеширования FIPS, такие как SHA1, SHA224, SHA256, SHA384, а также SHA512 и MD5.

Python также поддерживает функции хеширования adler32 и crc32, но они содержатся в модуле zlib. Одно из самых популярных применений хеширования это хранение хеша пароля, вместо самого пароля.

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

Существует метод быстрого создания хеша, мы рассмотрим его, когда создадим наш хеш sha512:

import hashlib

result = hashlib.sha1(b'hello').hexdigest()
print(result)

input()
# Будет выведено: aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d

В данном примере мы создали наш экземпляр хеша и вызвали его метод дайджеста одновременно. Далее, мы выводим наш хеш, чтобы на него посмотреть.

Вывод ключа

У Python весьма ограниченная поддержка вывода ключа, встроенная в стандартную библиотеку. Фактически, единственный метод, предлагаемый hashlib это pbkdf2_hmac, который является основанной на пароле функцией вывода ключа PKCS#5.

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

Например, если вы собираетесь использовать SHA-256, вам может понадобиться соль минимум в 16 битов и 100.000 итераций.

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

import binascii
import hashlib

dk = hashlib.pbkdf2_hmac(hash_name='sha256',
                         password=b'bad_password34',
                         salt=b'bad_salt',
                         iterations=100000)

result = binascii.hexlify(dk)
print(result)

input()
# Будет выведено: b'1a5abae9b195a4d1dbd2c79d9787841c2c68c39e507c3f26e89b2969eea8dac6'

Здесь мы создаем хеш SHA256 в пароле при помощи соли со 100,000 итераций. Конечно, SHA в буквальном смысле не рекомендуется для создания ключей паролей. Вместо этого, вам лучше использовать что-то вроде scrypt. Пакет bcrypt разработан специально для хеширования паролей.

2. RSA

RSA – криптографический алгоритм с открытым ключом. При создании приложения вы генерируете два ключа: публичный (открытый) и приватный (закрытый).

Открытый ключ передается всем желающим и заинтересованным. С его помощью можно зашифровать данные. А вот расшифровать можно только зная другой ключ из пары (т.е. закрытый).

Чтобы установить модуль RSA для Python необходимо прописать в командной строке (от имени администратора):

pip install rsa

Пример использования RSA:

import rsa
(pubkey, privkey) = rsa.newkeys(512)
message = b'Demo text'
 
# шифруем
crypto = rsa.encrypt(message, pubkey)
print(crypto)
print("\n")
#расшифровываем
message = rsa.decrypt(crypto, privkey)
print(message)

input()
# Будет выведено: 
# b'\x0e4\x91\xe8r\xa3\xe2`\xf7z\xffs\xf2\x80\xfb\x8c\xf2\x19R\xb7\x1f\x0c\x0f\xaf\xe5*o\xd2\xb7&]E\xa6\xa0b\xcc#\x1bv\xa2a\xe1iO#fs\xa8]\xc2\xf7\xc3\xe2s.s \x13|M\xd5P\xcb\x91'

# b'Demo text'

3. cryptography

Пакет cryptography нацелен на то, чтобы быть «криптографом для людей», равно как и библиотека requests является «HTTP для людей».

Суть в том, что вам нужно разработать простые криптографические рецепты которые и безопасны, и простые в использовании.

Чтобы установить модуль cryptography для Python необходимо прописать в командной строке (от имени администратора):

pip install cryptography

Cryptography установится совместно с несколькими зависимостями. С помощью модуля Fernet можно зашифровать текст. Рассмотрим пример:

from cryptography.fernet import Fernet

# Шифруем
cipher_key = Fernet.generate_key()
cipher = Fernet(cipher_key)
text = b'Message'
encrypted_text = cipher.encrypt(text)
print(encrypted_text)
print("\n")

# Дешифруем
decrypted_text = cipher.decrypt(encrypted_text)
print(decrypted_text)

input()
# Будет выведено:
b'gAAAAABeU57f6UhNhi8WtK11n5sj5MNcwl1JoTd_i8VaR1-74w5Ub0riQMMC6Ak5TSopFN-dCg4MRODSL-w2HD9RGKYfkhHTug=='

b'Message'

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

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

Следующий шаг, это создание сообщения, достойного шифровки, с последующей его шифровкой при помощи метода encrypt.

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

 
Поделиться в facebook
Facebook
Поделиться в twitter
Twitter
Поделиться в vk
VK
Поделиться в google
Google+
Поделиться в email
Email

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Группа в VK

Помощь проекту

Обнаружили опечатку?

Сообщите нам об этом, выделите текст с ошибкой и нажмите Ctrl+Enter, будем очень признательны!

Свежие статьи

Похожие статьи

Связи между моделями.

Связи между моделями.

В нашем проекте есть одна модель под названием “Объявления”. В этой статье мы создадим новый класс модели “Rubric”, которая будет представлять рубрики объявлений. Допишем в

 
Параметры полей и моделей.

Параметры полей и моделей.

Для того, чтобы наша административная панель Django выглядела более понятна для обычного пользователя необходимо указать правильные названия полей. Наша созданная модель представляется непонятной аббревиатурой “Bbs”,

 
Административный web-сайт Django.

Административный web-сайт Django.

Административный web-сайт предоставляет доступ ко всем моделям, объявленным во всех приложениях, что составляют проект. С помощью данной панели можно просматривать, добавлять, править и удалять записи,

 

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: