encryption - 通过 SSL 发送整数而不是字符串以节省带宽是个好主意吗?
问题描述
我正在创建一个具有客户端-服务器设计的应用程序。客户端和服务器通过 WebSocket 以二进制消息(CBOR 数组)的形式发送数据,从而相互通信。我没有发送字符串,而是创建了一个用整数映射的字典,如下所示:
const DICT: &[&str] = &[
"USERNAME_NOT_AVAILABLE",
"USERNAME_AND_PASSWORD_DID_NOT_MATCHED",
....blablba long list ....
];
// genrates code like this:-
// pub const USERNAME_AND_PASSWORD_DID_NOT_MATCHED : u16 = 4;
fn gen_rust(version: &String) -> String {
let mut code = format!(
"//generated code from Examer server version {}\n\n",
version
);
for (index, element) in DICT.iter().enumerate() {
code.push_str(&format!("pub const {} : u16 = {};\n", element, index))
}
code
}
然后在客户端和服务器之间共享生成的字典,我发送整数而不是字符串。
如果我经常犯拼写错误,这种方法确实提供了诸如自动完成和编译时错误之类的好处,但这是否会在使用 SSL 加密时减少消息的大小?我听说如果消息太小,则添加填充,因此我减小消息大小的主要目标将无法实现。
解决方案
现代 TLS 密码套件(这是 TLS 1.3 中唯一可用的,也是 HTTP/2 唯一允许的)不使用填充。这是因为 AES-GCM 和 ChaCha20-Poly1305 是基于 CTR,而不是 CBC。
请注意,(过时的)CBC 密码套件中的填充为每条消息最多 16 个字节,通常被认为是微不足道的。
请注意,websocket 的框架以及 TLS 记录和 MAC 的框架都是您无法删除的带宽开销。您不能只发送原始 CBOR 值,并使用某种长度保持加密进行加密。
您应该使用wireshark 来观察应用程序发送消息时实际发送了多少数据。
推荐阅读
- javascript - 发送许多并行获取请求(超过最大浏览器支持)
- java - 使用流(Java)获取整数形成字符串
- api - 使用 dart、flutter web 和 api 的 Paytabs 支付集成
- javascript - 如何*在* GSAP 时间线动画完成后删除一个类?
- python - 为 python -m 定义 powershell 函数
- javascript - ReferenceError:简单代码工作时未定义文档
- c - 按结构内字段的值对结构数组进行排序
- python - 将 gensim KeyedVector 转换为模型的过程是什么?
- c++ - Windows 10 C++ NetworkExplorerPlugins 上下文菜单处理程序示例
- lisp - push 宏存储功能正常但未失效