Хеширование vs Шифрование: в чем разница и когда что использовать(основы)

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

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

Что за технологии и где используются

Хеширование – это процесс преобразования любого объёма данных в уникальную строку фиксированной длины. Главная особенность хеширования – его необратимость. Вы или иное лицо не можете восстановить исходный текст из хеша. Оно используется везде, где нужно проверить подлинность данных, не зная самих данных: от хранения паролей в базах данных до антивирусов и проверки целостности файлов.

Шифрование – это способ кодирования информации с целью ее скрыть от посторонних, но сохранить возможность восстановления(дешифрования) для определенных лиц. Здесь всегда используется «ключ». Шифрование очень важно для передачи данных по сети(пример: HTTPS), защиты данных пользователя в мессенджерах и хранения конфиденциальных документов.

Как работает хеширование

Принцип работы хеш-функции можно сравнить с работой шредера: вы можете превратить бумагу и всё что на ней написано в измельчённую бумагу, но собрать бумагу в единое целое почти невозможно.

                                          Пример работы хеш-функции(MD5-хеш) 
                                          Пример работы хеш-функции(MD5-хеш) 

Основные свойства

  • Детерминированность: всегда один и тот же вход даёт на выходе тот же результат.
  • Фиксированная длина: неважно, хешируете вы одно слово или целое произведение результат будет одинаковой длины.

  • Лавинный эффект: даже малейшее изменение данных меняет хеш.

  • Стойкость к коллизиям: минимальная вероятность, что два разных выхода дадут одинаковый хеш.

Пример кода на Python

import hashlib no_hash = "123456790" #магия превращения c использованием sha256 hash = hashlib.sha256(no_hash.encode()).hexdigest() print(f"Без хеш: {no_hash}") print(f"Хеш: {hash}") #Результат #Без хеш: 123456790 #Хеш: 8ef9d62eb2287bf8a25ab101310903c9a0eb83bdca68b6e1cffe338dcc6a9e7d

Пример кода для перевода символов и превращение в хеш для дальнейшего хранения в БД

Где применять

  • Хранения паролей: В БД лежат хеши. В момент входа пароль сравнивается с тем что в базе и пускает в аккаунт.

  • Контрольные суммы: Проверка, не сломался ли файл при загрузке.

  • Блокчейн: Связывание блоков через их хеши.

Как работает шифрование

Шифрование – это двухсторонняя система. Главная задача – обеспечить конфиденциальность данных при передаче между пользователями.

Делится на два базовых типа:

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

                                              Схема симметричного шифрования
                                              Схема симметричного шифрования
  • Асимметричное – используется два ключа, один ключ публичный(для шифрования) и приватный(для расшифровки). Плюсы: безопасность, не нужно передавать ключ по каналу, но минус в уменьшенной скорости работы, и сложность реализации.

                                             Схема асимметричного шифрования
                                             Схема асимметричного шифрования

Примеры на Python

Симметричное шифрование

from cryptography.fernet import Fernet #создаём ключ key = Fernet.generate_key() cipher_suite = Fernet(key) #шифрование cipher_text = cipher_suite.encrypt(b"Hello worl")# передача толко в bytes print(f"Зашифровано: {cipher_text}") #то что может получить злоумышленник без ключа #расшифрование print(f"Расшифровано: {cipher_suite.decrypt(cipher_text)}") #Результат #Зашифровано: b'gAAAAABp0qF8tjW-0ROFgZzCOVeMXDq_SZn58e-vF2RbZpiyAcEE5SkuQEDPb0XHvmCNsTxoD677osINpHEUvDeGyWwUTbgmUw==' #Расшифровано: b'Hello worl'

Асимметричное шифрование(метод RSA)

from cryptography.hazmat.primitives.asymmetric import rsa, padding from cryptography.hazmat.primitives import hashes #ключи private_key = rsa.generate_private_key(key_size=2048, public_exponent=65537) publuc_key = private_key.public_key() #шифрование encrypted_message = publuc_key.encrypt(b"Hello wold", padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),# добавляем algorithm=hashes.SHA256(), label=None ) ) print(f"Зашифровоно (RSA): {encrypted_message.hex()[:60]}") #расшифровка #главное чтобы был метод расшифровки #лучше выносить его в отдельную функцию original_message = private_key.decrypt(encrypted_message, padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None )) print(f"Расшифровано: {original_message.decode()}") #результат #Зашифровоно (RSA): 06918df091715b27083faf83edca65f5f3fac7d9c4046e8a1ff5c6263876 #Расшифровано: Hello wold

Можно использовать

  • Мессенджерах

  • Защита дисков

Главные различия: Сводная таблица

Хеширование vs Шифрование: в чем разница и когда что использовать(основы)

Частые ошибки

  • Никогда не шифруйте пароли

Если злоумышленник украдет ключ шифрования, то он получит все пароли в чистом виде. Только хеш и только ХЕШИРОВАНИЕ !

  • Используйте Salt

Для хеширование паролей обычно просто алгоритма хеширования мало, так как есть базы предрассчитанных хешей. Чтобы защититься лучше, к паролю надо добавлять «Соль», обычная доп. строка со случайными символами.

  • Следите за новостями

Бывает что алгоритмы хеширования взламывают, и хеширование пароли могут быть рассекречены.

Заключение

  • Хеширование – это идеальный инструмент для проверки. Оно говорит нам: «Эти данные те самые, которые мы ожидали», при этом не раскрывая самих данных. Оно незаменимо в аутентификации и контроле целостности.

  • Шифрование – это инструмент для скрытия. Оно позволяет безопасно передавать секреты через открытый интернет, гарантируя, что прочитать их сможет только владелец ключа.

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

Неважно, насколько плохую защиту вы сделаете, — важно то, что она есть.

Один из безопасников
3
Начать дискуссию