主要观点:对于初学密码学的程序员,存在“已知的未知”(如陌生术语等),而真正给密码学带来声誉的是“未知的未知”,即会让经验丰富的开发者也惊讶的事情。以 JavaScript 代码为例展示了比较运算符“!==”易受计时攻击,攻击者可通过观察比较时间来破解密钥,如 16 字节密钥普通暴力攻击需约 1.7×10³⁸ 次猜测,计时攻击只需几千次。常见建议如添加随机睡眠时间或设置预估计算时间加睡眠来阻止攻击,但都存在问题,如攻击者可通过统计等方法突破,现代计算机多任务并发执行使代码睡眠时间影响其他任务完成时间等。代码在同一硬件上运行时会向其他线程和进程泄露信息,如竞争 CPU 缓存等,且这些在硬件层面发生,云计算环境也无法阻止。最佳实践是编写“常量时间”代码,即秘密信息不影响硬件资源使用,规则包括秘密值不能用于决定执行代码、访问内存地址等,但实际中在高级语言中实现较复杂,需注意编译器行为,可靠方法是检查编译器输出,Adam Langley 已做相关工作,最终最好的解决方案是教会编译器生成抗计时攻击的代码。
关键信息:
- 介绍了 JavaScript 代码中的计时攻击及危害。
- 阐述了常见阻止攻击方法的问题。
- 强调代码在硬件层面的信息泄露问题。
- 提出“常量时间”代码的概念及规则。
- 讨论了在高级语言中实现抗计时攻击代码的困难及解决方法。
重要细节:
- 比较运算符“!==”易受计时攻击及原理。
- 各种阻止攻击方法的具体情况及问题。
- 代码在硬件层面的多种信息泄露情况。
- “常量时间”代码的具体规则及实现困难。
- 检查编译器输出以确保代码安全的方法。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。