首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSLEngine解包装() javax.crypto.BadPaddingException:坏记录javax.crypto.BadPaddingException

SSLEngine解包装() javax.crypto.BadPaddingException:坏记录javax.crypto.BadPaddingException
EN

Stack Overflow用户
提问于 2013-11-20 01:09:57
回答 1查看 3.8K关注 0票数 2

这已经让我发疯好几天了。我使用java创建了一个客户端,并使用SSLEngine进行ssl加密。握手很好,我给一个网站写了一个GET请求,它很好(我用200个代码获得了标题)。问题是,当网站将数据包发回时,在第二个数据包上,我会得到一个BadPaddingException。下面是我的阅读方法:

代码语言:javascript
复制
    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请求很简单,如:"GET \r\n nHost: www.google.com\r\n\r\n“

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

编辑:例外是..。

sun.security.ssl.Alerts.getSSLException(Unknown (未知源),sun.security.ssl.SSLEngineImpl.fatal(未知源),sun.security.ssl.SSLEngineImpl.readNetRecord(Unknown (源),sun.security.ssl.SSLEngineImpl.unwrap(未知源),javax.net.ssl.SSLEngine.unwrap(未知源),ssl.engine (未知源)ssl.engine.impl.ChannelHandler.read(ChannelHandler.java:144) at ssl.engine.impl.ChannelHandler.run(ChannelHandler.java:69) at java.lang.Thread.run(不明来源)的.impl.SecureIO.read(SecureIO.java:244)由: javax.crypto.BadPaddingException: sun.security.ssl.EngineInputRecord.decrypt(Unknown Source上的坏记录MAC造成的.8 moreClosing下降

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-20 04:56:43

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

  1. 从你的应用程序接收器缓冲区。
  2. 如果是空的,请尝试unwrap().
  3. 如果这给了你一个缓冲下流,读取通道。

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

  1. 放入您的应用程序发送缓冲区。
  2. 如果填补了,wrap().
  3. 如果这会导致缓冲区溢出,请编写。

或者当你需要冲洗的时候做所有的事情。

您的主要接口应该是与引擎,并且只与通道,因为引擎告诉你关于缓冲区的潜流和溢出。

类似地,您必须让引擎指定握手( engine _WRAP/ must _UNWRAP),而不是尝试对其进行口授。

SSLEngine是一件很难纠正的事情。许多人尝试过,很少有人成功。要想获得成功,这是商业产品的基础,请参阅我的书“,Springer 2006,这里”的源代码中的这里类。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20085490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档