Когда мы передаем данные в открытом виде (например, данные кредитной карты при оплате в магазине), скажем по сети интернет их могут перехватить (как дело десятое).
Например, сниффинг трафика с интерфейса моей сетевой карты. Данные (логин и пароль) для аутентификации на этом форуме уходят в сеть в открытом виде. Бери-не хочу. Все личные сообщения можно читать не авторизовываясь.
![Изображение](https://i.ibb.co/7khFcqV/01.png)
Мы хотим себя обезопасить, а именно:
- шифрование (никто не знает наших данных)
- целостность (никто не изменил данные при передаче)
- защита от воспроизведения (никто не повторил нашу транзакцию)
- аутентификация (кому мы вообще шлем наши данные).
Целостность осуществляется за счет взятия функции (MD5, SHA) от данных (хэш). ABC->md5->5f3466. Данные передаются вместе c хэшом. Получатель рассчитывает хэш от полученных данных и если он совпадает с прикрепленным, то все ок. Хотя не совсем так, поскольку можно заменить данные и заново рассчитать хэш. Поэтому к данным добавляют некий ключ, который известен только отправителю и получателю.
Защита от воспроизведения осуществляется добавлением серийного номера в протоколы передачи.
С шифрованием и аутентификацией сложнее.
Шифрование- это функция в которую подается данные с ключом. Проще говоря шифруются ключом.
Симметричное шифрование (3DES, AES) - данные шифруются и расшифровываются одним и тем же ключом. Быстро и просто. Проблема стоит в передаче общего ключа по открытому каналу.
Ассиметричное шифрование (RSA, Диффи — Хеллман). Существует пара открытый/закрытый ключ (RSA). То что зашифровано закрытым ключом, можно расшифровать только открытым ключом (и наоборот). Открытые ключи передаются между отправителем и получателем. Проблема в том, что прислать открытый ключ тебе может кто угодно и это происходит медленно. Не подходит для шифрования больших объемов данных. Проблему "кто угодно" решает инфраструктура PKI.
Public Key Infrastructure
Никто не доверяет никому, но все доверяют определенному центру сертификации. Центр сертификации имеет свою пару открытый/закрытый ключ. Пользователь посылает свой открытый ключ в ЦС. ЦС его заверяет- к открытому ключу добавляется некая информационная обвязка (стандарт x.509 можно найти в википедии), от нее рассчитывается хэш и шифруется закрытым ключом (это будет сертификат SSL). Так же пользователю передается открытый ключ ЦС- корневой сертификат (в случае SSL установлены в браузере).
![Изображение](https://i.ibb.co/QDYK1gG/image.jpg)
Как работает SSL.
Сервер передает клиенту (браузеру) свой открытый ключ. Браузер использует открытый ключ ЦС, расшифровывает хэш в полученном от сервера ключе, рассчитывает хэш от полей сертификата и сравнивает расшифрованный и полученный. Если они совали, то все ок. Так же посылаются запросы в ЦС на предмет отзыва сертификата (в случае потери закрытого ключа), домена, кому выдан сертификат. Аутентификация пройдена. Теперь браузер генерирует общий ключ для симметричного шифрования, шифрует его открытым ключом сервера и передает ему. Сервер расшифровывает своим закрытым ключом. В последних версиях насколько я помню RCA используется только для аутентификации, а для передачи общего секретного ключа используется Диффи — Хеллман.