许多工程师选择 Rust 作为他们实现加密协议的首选语言,因为它具有强大的安全保证。
尽管 Rust 使安全的密码工程更容易,但仍有一些挑战需要注意。其中之一是:需要保留恒定时间(constant-time)属性,这确保无论输入如何,代码都将始终花费相同的时间来运行。
这些属性在防止时序攻击(timing attack)方面很重要,但它们可能会受到编译器优化的影响。
如何阻止编译器优化破坏代码的恒定时间呢?有几种方案:
(1)使用 -C opt-level=0 关闭所有优化。这种方案基本不可行,因为我们需要编译器的优化。
(2)使用来自 subtle crate 的构造来尝试阻止 LLVM 优化恒定时间代码路径的尝试。
(3)语言内置私密类型来支持。之前有一个 Rust RFC引入了 secret types,但这已被推迟,等待 LLVM 支持。
在node中使用 WASM,意味着需要经过两次优化:
(1)由 Rust 经过 LLVM 编译为 WebAssembly;
(2)再由 V8 的 Turbofan JIT 编译器再次对 WAMS 进行编译优化。