Давайте чётко обозначим разницу между терминами:
🔸 Хэширование
Цель — получить краткое представление объекта.
Objects.hash("пирожок") = 564453454
Результат не зависит от внешних параметров. Объект обратно восстановить нельзя. Самые популярный алгоритм — SHA, иногда используется MD5.🔸 Кодирование
Цель — преобразовать сообщение для передачи. Используется при ограничениях на формат сообщений.
Пример: нужно передать JSON туда, где ожидается обычный текст.
Кодировка Base64 переводит любой битовый массив в простые символы — цифры, латинские буквы,
+, / и =. Уйдут скобки, кавычки и всё, что может смутить канал передачи или библиотеку получателя.Base64.encode("{"/пирожок"/}") = "TWFuIGlzIGRpc3Rp="
После получения закодированное сообщение приводится к исходному виду:Base64.decode("TWFuIGlzIGRpc3Rp=") = "{"/пирожок"/}"
🔸 Шифрование Цель — защитить сообщение от посторонних. Зашифровать и прочитать сообщение могут только обладатели связанных ключей
Хэширование, кодирование и шифрование — это кирпичики, из которых собираются остальные механизмы безопасности.
🔹Например, электронная подпись
Это файлик с расширением
.sig, который прилагается к сообщению и доказывает его подлинность.Само сообщение передаётся в открытом виде и никак не скрывается.
❓ Как это работает?
Подпись может быть на основе любого алгоритма шифрования:
Симметричный алгоритм (редко используется):
▫️ Отправитель вычисляет хэш сообщения и шифрует его ключом
▫️ Получатель выполняет те же действия со своим ключом и сравнивает значение с присланной подписью
▫️ Если сообщение изменилось (поменялся хэш) или использовался не тот ключ, то значения не совпадут. Нет доверия такому документу🙂
Ассиметричный алгоритм:
▪️ Отправитель формирует подпись из хэша сообщения и приватного ключа
▪️ Получатель для проверки вызывает функцию, которая соотносит подпись, хэш сообщения и публичный ключ
Таким образом электронная подпись — это сочетание хэширования и шифрования. В JDK всё это находится в пакете
java.security.