Skip to content

Instantly share code, notes, and snippets.

Created February 9, 2015 17:48
Show Gist options
  • Save anonymous/f5931572b84b1e9f97b4 to your computer and use it in GitHub Desktop.
Save anonymous/f5931572b84b1e9f97b4 to your computer and use it in GitHub Desktop.
Передача секрета между сервером и клиентом. Безопасная реализация
Цель: обе стороны должны иметь одно и то же значение - секрет. Это может быть что угодно (обычно массив байтов)
Условие:
Существует способ симметрической криптографии (публичный ключ используется для зашифровки, секретный ключ используется для расшифровки). Используя этот способ никто не может узнать второй ключ, зная один из пары.
Решение:
1. Сервер создает случайную пару ключей.
2. Сервер передает публичный ключ клиенту (третья сторона имеет доступ к публичному ключу)
3. Клиент получает публичный ключ.
4. Клиент создает секрет.
5. Клиент шифрует этот секрет с помощью публичного ключа, полученного с сервера.
6. Клиент передает зашифрованный секрет серверу (третья сторона имеет доступ к зашифрованному секрету)
7. Сервер получает зашифрованный секрет.
8. Сервер расшифровывает секрет, полученный от клиента, с помощью секретного ключа ранее созданной пары.
9. Сервер получает секрет.
Таким образом клиент имеет секрет, потому что он его создал, а,сервер имеет секрет, потому что получил его в зашифрованном виде от клиента. Задача решена.
Третьи стороны имеют:
- Публичный ключ для одноразового шифрования секрета
- Зашифрованный секрет
Любые изменения информации приведут к ошибке обмена секретом.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment