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