为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我们需要一个恒定时间*单字节*比较函数?

为什么我们需要一个恒定时间*单字节*比较函数?

Go
明月笑刀无情 2021-06-22 17:05:04
查看 Go 标准库,有一个ConstantTimeByteEq函数,如下所示:func ConstantTimeByteEq(x, y uint8) int {    z := ^(x ^ y)    z &= z >> 4    z &= z >> 2    z &= z >> 1    return int(z)}现在,我理解需要进行恒定时间字符串(数组等)比较,因为常规算法可能会在第一个不相等元素之后短路。但是在这种情况下,两个固定大小整数的常规比较不是已经在 CPU 级别进行了恒定时间操作吗?
查看完整描述

3 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

不必要。并且很难说编译器在进行优化后会发出什么。对于高级别的“比较一个字节”,您最终可能会得到不同的机器代码。在侧信道中泄漏一点点可能会将您的加密从“基本上无法破解”更改为“希望不值得破解所需的钱”。


查看完整回答
反对 回复 2021-06-28
?
四季花海

TA贡献1811条经验 获得超5个赞

如果调用该函数的代码根据结果立即分支,则使用常量时间方法不会提供太多额外的安全性。另一方面,如果要在一堆不同的字节对上调用该函数,保持结果的运行总数,并且仅根据最终结果进行分支,那么外部窥探者可能能够确定最后分支被采用,但不知道是哪个先前的字节比较负责它。

话虽如此,我不确定在大多数用例中我是否看到了将方法的输出提炼为 0 或 1 的麻烦的很多优点;简单地保持运行记录notEqual = (A0 ^ B0); notEqual |= (A1 ^ B1); notEqual |= (A2 ^ B2); ...将达到相同的效果并且速度更快。


查看完整回答
反对 回复 2021-06-28
  • 3 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信