Получи случайную криптовалюту за регистрацию!

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.