По сути, все, что вам нужно сделать, это сообщить серверу открытый ключ, а затем подписать все ваши сообщения им.Если вам не нужны предварительные общие ключи, сервер не может быть уверен, что кто-то, кто регистрируется, на самом деле является одним из ваших устройств.Однако вы все еще можете проверить, что сообщение пришло с того же устройства, которое первоначально было зарегистрировано с этим идентификатором.
Процесс в основном происходит следующим образом:
- Клиент генерирует новую пару ключей (например, пара открытых / закрытых ключей RSA.
- Клиент регистрируется на сервере, отправляя свой открытый ключ.Сервер хранит этот открытый ключ.
- Когда клиент отправляет сообщение, он генерирует подпись своего сообщения, которое он прикрепляет к сообщению.Когда сервер получает сообщение, он проверяет подпись, чтобы убедиться, что сообщение было отправлено кем-то, имеющим соответствующий закрытый ключ.
Код для этого в PyCrypto выглядит примерно так:this:
Генерация пары ключей
from Crypto.PublicKey import RSA
key = RSA.generate(2048)
private_key = key.exportKey()
public_key = key.publickey().exportKey()
# private_key is a string suitable for storing on disk for retrieval later
# public_key is a string suitable for sending to the server
# The server should store this along with the client ID for verification
Генерация подписи
from Crypto.PublicKey import RSA
from Crypto.Hash import SHA
key = RSA.importKey(private_key)
# where private_key is read from wherever you stored it previously
digest = SHA.new(message).digest()
signature = key.sign(digest, None)
# attach signature to the message however you wish
Сервер должен загрузить открытый ключ, как он был ранее сохранен, и использовать команду "verify"метод, предоставляемый Scala / Java crypto API, который вы используете, и принимайте сообщение только в случае успеха.
Важно понимать предостережения каждого подхода, поскольку различные методы защищают только от определенных типов атак.Например, описанный выше подход не защищает от «повторной атаки», при которой злоумышленник записывает сообщение с определенным значением, а затем повторно передает его на сервер в более позднее время.Одним из способов защиты от этого было бы включение метки времени в сообщение, которое хэшируется;другое - использовать должным образом зашифрованный транспорт (например, SSL / TLS).