我如何使用SSLEngine方法wrap&打开应用程序数据?

时间:2014-09-30 20:49:33

标签: java ssl encryption nio

我在Java中使用带有NIO的SSL和一个简单的客户端/服务器概念验证应用程序。我有握手和&运行得很好,但试图加密&解密应用程序数据后让我疯了。我想知道我是否遗漏了预期用途的东西?

客户端在“payload”中有一条小消息,并尝试加密它以进行传输,如下所示:

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'之外......我在这里错过了什么?

1 个答案:

答案 0 :(得分:1)

您永远不会将有效负载放入客户端的应用程序发送缓冲区中,因此您发送了13个空字节。

在那之后,除了错别字之外,一切都很美妙。

你会认为这会导致无法发送任何内容,因为缓冲区最初是空的,但是因为你没有在wrap()之前翻转()它,它处于一个状态,其中似乎有13个字节