gpt4 book ai didi

java - SSLEngine 展开()javax.crypto.BadPaddingException : bad record MAC

转载 作者:太空宇宙 更新时间:2023-11-03 13:18:06 25 4
gpt4 key购买 nike

这几天一直让我发疯。我使用 Java nio 创建了一个客户端,使用 SSLEngine 进行 ssl 加密。握手工作正常,我向网站写了一个 GET 请求,它工作正常(我得到带有 200 代码的 header )。问题是当网站发回数据包时,在第二个数据包上我得到一个 BadPaddingException。这是我的阅读方法:

    public void read(SelectionKey key,ByteBuffer readBuffer) throws IOException, BadPaddingException {

SocketChannel socketChannel = (SocketChannel) key.channel();

ByteBuffer clientSSLData = ByteBuffer.allocate(getPacketBufferSize());
System.out.println("Reading data. PacketBufferSize: "+(getPacketBufferSize()));
int length = socketChannel.read(clientSSLData);

System.out.println("read "+length+" bytes");
if (length == -1){
System.out.println("Length is -1 which means nothing was read from the channel ");
socketChannel.close();
return;
}
clientSSLData.flip();
readBuffer.clear();
SSLEngineResult res = sslEngine.unwrap(clientSSLData, readBuffer);
System.out.println(res.toString());
}

我的获取请求很简单,如下所示:“GET\r\nHost: www.google.com\r\n\r\n”

基本上如果它是一个像https://www.example.com这样的小网站,我接收没有问题,因为它在一次读取中发送。但是如果我做类似 https://www.google.com 的事情,我得到了 BadPaddingException。有任何想法吗?谢谢!

编辑:异常(exception)是...

javax.net.ssl.SSLException: bad record MAC at sun.security.ssl.Alerts.getSSLException(Unknown Source) at sun.security.ssl.SSLEngineImpl.fatal(Unknown Source) at sun.security.ssl.SSLEngineImpl.readRecord(Unknown Source) at sun.security.ssl.SSLEngineImpl.readNetRecord(Unknown Source) at sun.security.ssl.SSLEngineImpl.unwrap(Unknown Source) at javax.net.ssl.SSLEngine.unwrap(Unknown Source) at ssl.engine.impl.SecureIO.read(SecureIO.java:244) at ssl.engine.impl.ChannelHandler.read(ChannelHandler.java:144) at ssl.engine.impl.ChannelHandler.run(ChannelHandler.java:69) at java.lang.Thread.run(Unknown Source) Caused by: javax.crypto.BadPaddingException: bad record MAC at sun.security.ssl.EngineInputRecord.decrypt(Unknown Source) ... 8 moreClosing down

最佳答案

你做错了。当您需要获取数据时,您应该:

  1. 从您的应用接收器缓冲区获取。
  2. 如果那是空的,试试unwrap()。
  3. 如果这导致缓冲区下溢,请阅读 channel 。

同样当你需要放数据的时候,你应该:

  1. 放入您的应用发送缓冲区。
  2. 如果填满,wrap()。
  3. 写下是否会导致缓冲区溢出。

或者在您需要冲洗时执行所有操作。

您的主要接口(interface)应该与引擎连接,并且仅作为引擎告诉您有关缓冲区下溢和上溢的结果的 channel 。

同样,您必须让引擎指示握手 (NEED_WRAP/NEED_UNWRAP),而不是试图指示它。

SSLEngine 是一件很难做好的事情。许多人尝试过,但很少有人成功。对于一个成功的工作,这是商业产品的基础,请参阅我的书 Java 基础网络 的源代码中的 SSLEngineManager 类,Springer 2006,here .

关于java - SSLEngine 展开()javax.crypto.BadPaddingException : bad record MAC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20085490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com