如何为SSLEngine.wrap()选择合适的outClear缓冲区大小?
如何选择outClear缓冲区的大小?
如果outClear缓冲区尺寸过大,加密后的数据将无法容纳于outCrypt缓冲区中。请问应如何选择outClear缓冲区的大小?
int size = engine.getSession().getPacketBufferSize(); ByteBuffer inCrypt = ByteBuffer.allocate(size); ByteBuffer outCrypt = ByteBuffer.allocate(size); size = engine.getSession().getApplicationBufferSize(); ByteBuffer inClear = ByteBuffer.allocate(size); ByteBuffer outClear = ByteBuffer.allocate(???); // <--- 此处应填什么? result = engine.unwrap(inCrypt, inClear); result = engine.wrap(outClear, outCrypt);
更新时间:2026年5月30日
/** * Finish connecting non-blocking peer and begin handshake. */ @Override public boolean finishConnect() throws IOException { if (super.finishConnect()) { getEngine().beginHandshake(); write(EMPTY_BUFFER); return true; } return false; }
解答
直接用engine.getSession().getApplicationBufferSize()来分配outClear的缓冲区大小即可,修改后代码如下:
ByteBuffer outClear = ByteBuffer.allocate(engine.getSession().getApplicationBufferSize());
原因很明确:getApplicationBufferSize()会根据当前TLS会话使用的加密套件,计算出明文数据的最大允许长度——这段明文经wrap()加密后,生成的密文大小刚好不会超过你给outCrypt分配的packetBufferSize,完全避免密文无法容纳的问题。
另外要注意,TLS会话握手完成后这个值可能发生变化,建议每次调用wrap()前都确认当前会话的applicationBufferSize,保证缓冲区大小始终适配当前加密规则。
内容的提问来源于stack exchange,提问作者Evgeny
相关产品推荐
相关产品推荐

