gpt4 book ai didi

c# - 如何在加密有效负载前添加未加密的帧头(使用 Sslstream)

转载 作者:可可西里 更新时间:2023-11-01 02:41:07 24 4
gpt4 key购买 nike

我正忙于使用 C# 和 .NET Framework 4.5 实现 ICE-TCP (RFC 6544 https://www.rfc-editor.org/rfc/rfc6544)。但是,我面临着一个与协议(protocol)分层相关的非常棘手的问题,如下所示。

ICE-TCP RFC 说:

„ICE 需要一个代理来解复用 STUN 和应用层流量,因为它们出现在同一个端口上。这种多路分解在 [RFC5245] 中进行了描述,并使用 magic cookie 和消息的其他字段完成。
面向流的传输引入了另一个问题,因为它们需要一种方法来构建连接,以便可以提取应用程序和 STUN 数据包,以便将 STUN 数据包与应用层流量区分开来。
因此,使用 ICE 的 TCP 媒体流使用 RFC 4571 (https://www.rfc-editor.org/rfc/rfc4571#section-2) 中提供的基本框架,即使应用层协议(protocol)不是 RTP。“

框架方法如下所示:

 0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
---------------------------------------------------------------
| LENGTH | RTP or RTCP packet ... |
---------------------------------------------------------------

我还想在我的实现中使用 TLS,ICE-TCP RFC 说:

„当使用传输层安全性 (TLS) 或数据报传输层安全性 (DTLS) 时,它们也在 RFC 4571 框架垫片上运行,而 STUN 在 (D)TLS 连接之外运行。生成的 ICE TCP 协议(protocol)栈如图 1 所示,左侧有 (D)TLS,右侧没有。”

最后 ICE TCP 栈看起来像这样:

                   +----------+
| |
| App |
+----------+----------+ +----------+----------+
| | | | | |
| STUN | (D)TLS | | STUN | App |
+----------+----------+ +----------+----------+
| | | |
| RFC 4571 | | RFC 4571 |
+---------------------+ +---------------------+
| | | |
| TCP | | TCP |
+---------------------+ +---------------------+
| | | |
| IP | | IP |
+---------------------+ +---------------------+

所以我对图的左边很感兴趣。该图暗示帧 header 在 TLS 加密之外,我必须将未加密的 header 写入流。

目前,我的应用程序使用 SslStream 类包裹在我从 TCPClient 获得的 NetworkStream 周围。我的第一个意图是将帧头写入 NetworkStream,然后将加密的应用程序数据写入 SslStream。经过一些研究,我发现了这一点:

“在 AuthenticateAsClient/Server 之后,您的连接将受到 SSL 保护。然后不要调用 Socket 或 NetworkStream 方法:这会破坏 SslStream。“来源:C# Sockets and SslStreams

因此,一旦建立了 SSL 连接,我就无法写入 NetworkStream。

我的问题是:有没有办法在 TCP (NetworkStream) 和 TLS (SslStream) 之间“放置” header ?

提前致谢。

最好的问候

马库斯

最佳答案

SslStream 实例将自身分层在 NetworkStream 实例之上。您写入 SSL 流的任何数据都由 SSL 流处理,然后将其生成的任何数据写入 NetworkStream 实例。

如果您保留对 NetworkStream 的引用,您可以根据需要直接读取或写入 NetworkStream,绕过 SSL 流。

只要您不让连接两端的 SslStream 读取您直接写入 NetworkStream 的任何内容,SslStream 将继续正常运行。

实际上,您将沿单个流多路复用两个字节流。这些字节流之一将是 SSL 流,另一个将是您的其他流。只要连接的两端知道何时在两个流之间切换,就没问题。

关于c# - 如何在加密有效负载前添加未加密的帧头(使用 Sslstream),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19498540/

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