Security basics, часть 2: цифровая подпись и немножко терминов



Давайте чётко обозначим разницу между терминами:



🔸 Хэширование



Цель — получить краткое представление объекта.



Objects.hash("пирожок") = 564453454



Результат не зависит от внешних параметров. Объект обратно восстановить нельзя. Самые популярный алгоритм — SHA, иногда используется MD5.



🔸 Кодирование



Цель — преобразовать сообщение для передачи. Используется при ограничениях на формат сообщений.



Пример: нужно передать JSON туда, где ожидается обычный текст.



Кодировка Base64 переводит любой битовый массив в простые символы — цифры, латинские буквы, +, / и =. Уйдут скобки, кавычки и всё, что может смутить канал передачи или библиотеку получателя.



Base64.encode("{"/пирожок"/}") = "TWFuIGlzIGRpc3Rp=
"



После получения закодированное сообщение приводится к исходному виду:



Base64.decode("TWFuIGlzIGRpc3Rp=") = "{"/пирожок"/}
"



🔸 Шифрование



Цель — защитить сообщение от посторонних. Зашифровать и прочитать сообщение могут только обладатели связанных ключей



Хэширование, кодирование и шифрование — это кирпичики, из которых собираются остальные механизмы безопасности.



🔹Например, электронная подпись



Это файлик с расширением .sig, который прилагается к сообщению и доказывает его подлинность.



Само сообщение передаётся в открытом виде и никак не скрывается.



Как это работает?



Подпись может быть на основе любого алгоритма шифрования:



Симметричный алгоритм (редко используется):



▫️ Отправитель вычисляет хэш сообщения и шифрует его ключом

▫️ Получатель выполняет те же действия со своим ключом и сравнивает значение с присланной подписью

▫️ Если сообщение изменилось (поменялся хэш) или использовался не тот ключ, то значения не совпадут. Нет доверия такому документу🙂



Ассиметричный алгоритм:



▪️ Отправитель формирует подпись из хэша сообщения и приватного ключа

▪️ Получатель для проверки вызывает функцию, которая соотносит подпись, хэш сообщения и публичный ключ



Таким образом электронная подпись — это сочетание хэширования и шифрования. В JDK всё это находится в пакете java.security.