Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SSL流式传输-拆分的applicationdata_Java_Networking_Ssl_Streaming - Fatal编程技术网

Java SSL流式传输-拆分的applicationdata

Java SSL流式传输-拆分的applicationdata,java,networking,ssl,streaming,Java,Networking,Ssl,Streaming,我尝试通过已建立的SSL连接发送一个字节[]() 结果:字节[]被分为两个数据包(请参见下面的调试): 第一个数据包:应用程序数据的第一个字节(**01**) 第二个数据包:其余(fe db 01 00…)650字节 是否有一种方法可以在一个数据包中提交所有应用程序数据字节 要发送651字节的流: **01** fe db 01 00 00 02 83 3c 3f 78 6d 6c 20 76 65 72 73 69 6f 6e 3d 22 31 2e 30 22 20 65 6e 63 6

我尝试通过已建立的SSL连接发送一个字节[]()

结果:字节[]被分为两个数据包(请参见下面的调试):

  • 第一个数据包:应用程序数据的第一个字节(**01**
  • 第二个数据包:其余(fe db 01 00…)650字节
是否有一种方法可以在一个数据包中提交所有应用程序数据字节

要发送651字节的流:

**01** fe db 01 00 00 02 83 3c 3f 78 6d 6c 20 76 65 72 73 69 6f 6e 3d 22 31 2e 30 22 20 65 6e 63 6f 64 69 6e 67 3d 22 75 73 2d 61 73 63 69 69 22 20 73 74 61 6e 64 61 6c 6f 6e 65 3d 22 6e 6f 22 3f 3e …
javax.net.debug输出

Padded plaintext before ENCRYPTION:  len = 32
0000: **01** 06 03 06 46 7F 7F AE   D4 E8 30 5D B7 DB 3C 44  ....F.....0]..<D
0010: 02 08 C9 2A A1 0A 0A 0A   0A 0A 0A 0A 0A 0A 0A 0A  ...*............
1, WRITE: TLSv1 Application Data, length = 32
[Raw write]: length = 37
0000: 17 03 01 00 20 B3 4E EE   CE 5B 69 EC A5 4A 80 7F  .... .N..[i..J..
0010: D6 03 35 AF 6A 7B 85 17   B7 46 A2 31 B2 EF 7E D0  ..5.j....F.1....
0020: EA 1B 67 7E ED                                     ..g..
Padded plaintext before ENCRYPTION:  len = 672
0000: FE DB 01 00 00 02 83 3C   3F 78 6D 6C 20 76 65 72  .......<?xml ver
0010: 73 69 6F 6E 3D 22 31 2E   30 22 20 65 6E 63 6F 64  sion="1.0" encod
0020: 69 6E 67 3D 22 75 73 2D   61 73 63 69 69 22 20 73  ing="us-ascii" s
0030: 74 61 6E 64 61 6C 6F 6E   65 3D 22 6E 6F 22 3F 3E  tandalone="no"?>
[…]
加密前填充的明文:len=32
0000:*01**06 03 06 46 7F 7F AE D4 E8 30 5D B7 DB 3C 44….F….0].假设您在另一端写入字节时读取字节[],这是一个典型的TCP错误。它实际上并不特定于SSL/TLS,但也可能发生在TCP连接上

在TCP(以及SSL/TLS)中,无法保证读卡器的缓冲区将填充与写卡器缓冲区中的数据包完全相同的数据包长度。所有TCP保证都是按顺序交付的,因此最终您将获得所有数据,但您必须将其视为流

这就是为什么使用TCP的协议依赖于指示符和分隔符来告诉另一端何时停止读取某些消息

例如,HTTP 1.1使用一个空行来指示标头的结束时间,并使用
内容长度
标头来告诉收件人预期的实体长度(或分块传输编码)。SMTP还在邮件结尾使用换行符和

如果您正在设计自己的协议,则需要定义一种方式,让收件人知道您定义的有意义的数据单元何时被分隔。读取数据时,请读取此类指示符,并填充读取缓冲区,直到获得预期的字节数或找到已定义的分隔符。

Sun的impl注释:

默认情况下,我们在CBC模式下对选择的明文问题进行反击 SSLv3/TLS1.0中的密码套件,通过发送应用程序的一个字节 每个有效载荷的第一个记录中的数据,其余记录中的数据 后续记录。请注意,这些问题已在中解决 TLS 1.1或更高版本

使用
SSLEngine.wrap(largePlainText)
进行的实验表明,它生成2条SSL记录,第一条记录包含1字节的纯文本,第二条记录包含15846字节的纯文本

receiver API可能会逐个记录处理记录,因此第一次读取时将返回1字节

我们还可以在其他SSL impl中观察到这种行为,例如来自web浏览器的HTTPS请求


OpenSSL针对攻击插入空记录。如果接收器是Java SSL套接字,则输入流无法为read()返回0字节,因此将跳过该记录。其他接收器可能没有为0长度记录做好准备,并且可能会中断记录。

在看到此页面之前,我遇到了相同的问题:

因此,我使用-djse.enableCBCProtection=false参数运行JVM,现在数据没有被分割


致以最诚挚的问候

很好的参考。这是作为一个例子介绍的。甚至还有一个系统属性可以关闭它:
-djse.enableCBCProtection=false
。(@user1847275,您不应该使用此属性,而应该修复您的协议。)谢谢。你帮了我很大的忙。这两个包的签名不是零碎的(“不要零碎”)。但他们不应该吗?