主要观点:字符串相似度越高比较时间越长,可能导致计时攻击,但实际中字符串常不是逐字节比较且时间差异小,计时攻击不一定可行;不同编程语言的字符串比较方式及对计时攻击的影响不同。
关键信息:
- C 语言:glibc 的 strcmp 先比较字节至字边界再比较字,现代 CPU 有 AVX2 和 EVEX 指令集变体可一次比较 32 字节;strncmp 比较有可变时间可用于计时攻击,但时间按 8 字节块变化且差异小于纳秒;memcmp 只比较字节数,比较更多字节时间增加可忽略。
- C#:字符串比较可考虑当前文化,“智能”比较可通过指定
StringComparison.Ordinal
禁用,计时攻击仅在文化敏感比较时可能且时间差异小于纳秒。 - Python:测试的 40 字节字符串比较时间差异小到难以检测,计时图近似直线。
重要细节: - C 语言中 glibc 的 strcmp 实现细节及与其他函数的比较。
- C#中“智能”比较与
StringComparison.Ordinal
的关系。 - Python 测试的具体情况及结果。
结论:字符串比较的计时攻击有时可能发生,但不是所有strcmp
或==
使用都易受攻击,一些实现一次比较多字节,单个字符时间差异常小于纳秒难以远程检测。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。