2024 年 8 月 21 日,向 Swift 生态系统引入了对 Oblivious HTTP 的临时支持实现,提供了名为SwiftNIO Oblivious HTTP的新包。
Oblivious HTTP 是一种协议,允许客户端向服务器发出请求,而服务器无法识别这些请求的来源。传统 HTTP 请求会泄露关于客户端的识别信息,如源 IP 地址,并允许来自同一客户端的多个请求被识别为来自同一节点。相比之下,Oblivious HTTP 通过将 HTTP 消息加密与可信第三方中继服务相结合,提供了一种保护识别客户端信息的安全机制,在不增加显著性能开销的情况下为用户提供了更高的隐私。
它是支持一系列新兴隐私保护网络技术的重要基础技术,包括增强 DNS 隐私的提案。在苹果公司,还将其用于通过私有云计算将行业领先的苹果设备隐私扩展到云端。Oblivious HTTP 有助于确保关于请求源的个人可识别数据永远不会提供给处理请求的设备,还可以加强系统抵御针对个人个人数据请求的尝试。
今天发布的包仍处于积极开发阶段,是SwiftNIO 项目的一部分,用于开发可维护的高性能网络代码。它支持两个独立的标准:
- RFC 9292 的实现,该标准规范了序列化 HTTP 的二进制表示。
- RFC 9457 的实现,定义了 Oblivious HTTP 本身。
这两个实现可以一起使用或单独使用;它们使 Swift 客户端能够使用依赖 Oblivious HTTP 的服务,并使 Swift 服务器能够实现规范。
该包本身分为两个库:
- 主要库
ObliviousHTTP
提供了实现 Oblivious HTTP 所需的 RFC 9292 二进制 HTTP 编码方案的实现,以及该方案与 SwiftNIO 的绑定。 - 第二个库
ObliviousX
提供了更通用的 API,构成了 Oblivious HTTP 使用的加密方案的基础,但也可以应用于您选择的其他编码。
RFC 9292 的二进制 HTTP 表示定义了一种序列化和反序列化抽象 HTTP 消息的机制,不依赖于特定的有线格式,如 HTTP/1.1 或 HTTP/2。SwiftNIO Oblivious HTTP 提供了一个非常简单的序列化和反序列化 API。例如,如何使用 API 进行序列化和反序列化:
import ObliviousHTTP
import NIOCore
import NIOHTTP1
let serializer = BHTTPSerializer()
var buffer = ByteBuffer()
serializer.serialize(.request(.head(.init(method:.GET))), into: &buffer)
serializer.serialize(.request(.body(payload)), into: &buffer)
serializer.serialize(.request(.end(nil)), into: &buffer)
var parser = BHTTPParser(role:.server)
parser.append(buffer)
parser.completeBodyReceived()
while let message = try parser.nextMessage() {
print(message)
}
Oblivious HTTP 规范将 HTTP 的二进制序列化格式与基于混合公钥加密 (HPKE)的加密方案相结合。这种加密方案是完全通用的,因此除了二进制 HTTP 消息之外,还可以用于任何任意数据。
ObliviousX
库提供了一系列用于处理此封装方案的 API。它们有两种形式:单发射击函数,实现 RFC 9457 中的 OHTTP 方案,以及流形式,实现在草案分块 OHTTP 规范中定义的方案。例如单发射击 API 的使用:
import ObliviousX
// 加密
let message = Data("Hello, this is my secret message".utf8)
let (encapsulatedRequest, sender) = OHTTPEncapsulation.encapsulateRequest(
keyID: serverKeyID,
publicKey: serverPublicKey,
ciphersuite:.P256_SHA256_AES_GCM_256,
mediaType: "text/plain",
content: message
)
// 解密
let (header, consumedBytes) = OHTTPEncapsulation.parseRequestHeader(
encapsulatedRequest: encapsulatedRequest
)
assert(header.keyID == serverKeyID)
assert(header.kem ==.P256_HKDF_SHA256)
assert(header.kdf ==.HKDF_SHA256)
assert(header.aead ==.AES_GCM_256)
let decapsulator = OHTTPEncapsulation.RequestDecapsulator(
requestHeader: header,
message: encapsulatedRequest.dropFirst(consumedBytes)
)
let (deEncapsulated, context) = try decapsulator.decapsulate(
mediaType: "text/plain",
privateKey: serverPrivateKey
)
assert(deEncapsulated == message)
该包在早期开发阶段发布,以征求反馈和贡献。可以通过在 GitHub 上尝试SwiftNIO Oblivious HTTP 库开始,并在Swift 论坛上加入讨论该库并提出改进建议。
虽然核心加密方案被认为运行良好,但仍在完成二进制 HTTP 和 Oblivious HTTP 的完整绑定的设计工作。此外,以下是我们的路线图:
- 以可以放入 ChannelPipeline 的 ChannelHandlers 的形式生成更好的与 SwiftNIO 的绑定。
- 生成使用swift-http-types而不是 SwiftNIO 类型的 BinaryHTTP 版本,以更好地与 Swift 生态系统的其他部分组合,并可能完全消除对 SwiftNIO 的依赖。
- 在 IETF 最终确定该草案时,最终支持分块 Oblivious HTTP。
- 其他 API 调整以支持更广泛的用例。
在设计过程的这个阶段,欢迎社区反馈以及以拉取请求和问题形式的贡献,因为我们将在未来几个月努力完善支持并为现代互联网的基础提供更大的隐私保护。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。