[英]How do I use the SSLEngine methods wrap & unwrap with application data?
我正在通过简单的客户端/服务器概念验证应用程序在Java中使用SSL和NIO。 我已经握手并运行得很好,但是在尝试加密和解密应用程序数据后,真是发疯了。 我想知道我是否缺少预期用途的东西?
客户端在“有效负载”中有一条小消息,并尝试对其进行加密,如下所示:
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'中...我在这里缺少什么?
您永远不会将有效负载放入客户端中的应用程序发送缓冲区,因此您发送了13个空字节。
在那之后,除了错别字外,其他所有东西都工作得很好。
您可能会认为不会发送任何内容,因为缓冲区最初是空的,但是由于您在wrap()之前没有对它进行过flip()操作,因此它似乎处于其中包含13个字节的状态。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.