Как использовать методы SSLEngine для переноса и развертывания данных приложения?

1

Я использую SSL с NIO в Java с простым клиент-серверным приложением для проверки концепции. У меня есть рукопожатие и работает просто отлично, но попытка шифровать и расшифровывать данные приложения после того, как меня заводит. Интересно, не хватает ли я чего-то с точки зрения предполагаемого использования?

Клиент имеет небольшое сообщение в "полезной нагрузке" и пытается зашифровать его для передачи следующим образом:

ByteBuffer inb  = ByteBuffer.allocate(payload.length);
ByteBuffer outb = ByteBuffer.allocate(
            _sslEngine.getSession().getPacketBufferSize());
SSLEngineResult result = _sslEngine.wrap(inb, outb);
_log.finer("Wrapped " + outb.position() + " octets ("
                + result + ").");
outb.flip();
_log.finer("Cyphertext: " + Buffers.toHexString(outb));

В журнале я вижу:

FINER: Wrapped 53 octets (Status = OK HandshakeStatus = NOT_HANDSHAKING
bytesConsumed = 13 bytesProduced = 53).
Sep 30, 2014 1:33:51 PM PoCClientServer.PoCClient write
FINER: Cyphertext: [17 03 01 00 30 ac bd c3 b8 e4 2e a5 9a 43 41 e1 3a 81 b5 cc b6 6f 9b 55 0e 1a a5 e2 97 f1 a2 be 3d ed f8 2d 45 8b 99 35 70 e3 d2 74 6d da 63 34 5a c9 35 1a 96]

Так что все хорошо. Сервер читает это в "_net", затем пытается расшифровать:

_log.finer("Unwrapping cyphertext " + Buffers.toHexString(_net));

_app.ByteBuffer.allocate(_sslEngine.getSession().getApplicationBufferSize());
SSLEngineResult result = _sslEngine.unwrap(_net, _app);
_log.finer("Unwrapped " + _app.position()
            + " octets(" + result + ").");
_app.flip();
_log.finer("==> " + Buffers.toHexString(_app));

Что производит:

FINER: Unwrapping cyphertext [17 03 01 00 30 ac bd c3 b8 e4 2e a5 9a 43 41 e1 3a 81 b5 cc b6 6f 9b 55 0e 1a a5 e2 97 f1 a2 be 3d ed f8 2d 45 8b 99 35 70 e3 d2 74 6d da 63 34 5a c9 35 1a 96]
Sep 30, 2014 1:34:00 PM PoCClientServer.handlers.EchoHandler unwrap
FINER: Unwrapped 13 octets(Status = OK HandshakeStatus = NOT_HANDSHAKING
bytesConsumed = 53 bytesProduced = 13).
Sep 30, 2014 1:34:01 PM PoCClientServer.handlers.EchoHandler unwrap
FINER: ==> [00 00 00 00 00 00 00 00 00 00 00 00 00]

Все кажется хорошо снова... кроме того, что открытый текст никогда не помещался в "_app"... что мне здесь не хватает?

Теги:
encryption
ssl
nio

1 ответ

1
Лучший ответ

Вы никогда не помещаете полезную нагрузку в буфер отправки приложения в клиенте, поэтому вы отправили 13 нулевых байтов.

После этого все прекрасно работало, кроме опечаток.

Вы могли бы подумать, что это не вызовет ничего, потому что буфер изначально пуст, но поскольку вы не перевернули() его перед wrap(), он находился в состоянии, когда в нем оказалось 13 байтов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню