当前位置: 首页 > 面试题库 >

SSLEngine unwrap()javax.crypto.BadPaddingException:错误的记录MAC

拓拔嘉颖
2023-03-14
问题内容

这已经让我发疯了几天。我使用SSL引擎使用java
nio和ssl加密创建了一个客户端。握手可以正常工作,我向网站写入GET请求,并且工作正常(我获得了包含200个代码的标头)。问题是,当网站将数据包发回时,在第二个数据包上,我收到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());
}

我的获取请求很简单,例如:“获取\ r \ n主机:www.google.com \ r \ n \ r \ n”

基本上,如果它是一个像https://www.example.com这样的小型网站,那么我接收它不会有任何问题,因为它是按一次阅读发送的。但是,如果我执行https://www.google.com之类的操作,则会收到BadPaddingException。有任何想法吗?谢谢!

编辑:异常是…

javax.net.ssl.SSLException:sun.security.ssl.SSLEngineImpl.readRecord(在sun.security.ssl.Alerts.getSSLException(未知源)处的MAC记录错误。
sun.security.ssl.SSLEngineImpl.readNetRecord上的“未知源”(sun.security.ssl.SSLEngineImpl.unwrap处的未知源)(javax.net.ssl.SSLEngine.unwrap中的Unknown
Source)(ssl.engine处的Unknown
Source)。位于java.lang的ssl.engine.impl.ChannelHandler.run(ChannelHandler.java:69)的ssl.engine.impl.ChannelHandler的impl.SecureIO.read(SecureIO.java:244)
.Thread.run(未知源)原因:javax.crypto.BadPaddingException:sun.security.ssl.EngineInputRecord.decrypt处的记录不良MAC(未知源)…
8更多


问题答案:

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

  1. 从您的应用接收缓冲区中获取。
  2. 如果那是空的,请尝试 unwrap().
  3. 如果那给您带来缓冲区下溢,请阅读该通道。

同样,当您需要放置数据时,您应该:

  1. 放入您的应用程序发送缓冲区。
  2. 如果能解决, wrap().
  3. 如果那给您缓冲区溢出,请写。

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

您的主要接口应该与引擎一起使用,并且仅与通道有关,因为引擎告诉您有关缓冲区下溢和上溢的信息。

同样,您必须让引擎决定握手(NEED_WRAP / NEED_UNWRAP),而不是尝试决定握手。

SSLEngine是一件非常困难的事情。许多人尝试过:很少成功。要获得成功的成功,那就是商业产品的基础,请在此处参阅SSLEngineManager我的书《
Java基础网络》 (Springer
2006)源代码中的类。



 类似资料:
  • 编辑:异常是... javax.net.ssl.SSLException:在sun.security.ssl.alerts.getsslException(未知源)在sun.security.ssl.sslengineimpl.fatal(未知源)在sun.security.ssl.sslengineimpl.readRecord(未知源)在sun.security.ssl.sslengineim

  • 问题内容: 我一直在阅读“错误日志记录”,并且想出了“ error_log”函数,它似乎是处理错误日志记录的好工具。但是,最流畅和最佳的使用方式是什么? 如果我有一个 这会将错误记录在my-errors.log文件中。但是,如果我有时需要更改文件位置,新文件夹或其他内容的位置,该怎么办?如果我有大量文件,则需要全部更改。 现在,我开始考虑使用变量来设置错误日志的路径。当然可以,但是如果我想在函数或

  • 0.3 新版功能. 应用故障,服务器故障。早晚你会在产品中看见异常。即使你的代码是 100% 正确的, 你仍然会不时看见异常。为什么?因为涉及的所有一切都会出现故障。这里给出一些 完美正确的代码导致服务器错误的情况: 客户端在应用读取到达数据时,提前终止请求 数据库服务器超载,并无法处理查询 文件系统满了 硬盘损坏 后端服务器超载 你所用的库出现程序错误 服务器的网络连接或其它系统故障 而且这只是

  • 可确认下载失败或无法与互联网连接时等,最新的10件错误历史记录。 轻触列表的错误项目,会显示详细内容。部分项目还可确认建议解决方法。

  • 我有一个没有Java加密库的RSA代码类。很管用。 但是,当我从RSAPrivateKeySpec创建一个Java库PrivateKey,从类中的RSAPrivateKey创建一个模数和指数,并使用Java加密库a使用类encrypted BigInteger进行加密时,它会抛出。这里: 为什么? 对不起,我的英语不好

  • 我正在学习Fastapi,我正在localhost启动一个uvicorn服务器。每当出现错误/异常时,我都不会得到回溯。所有我得到的是: 所以,调试很困难,我正在试用python的日志模块 我还尝试过使用调试参数启动uvicorn