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