如何在固定时间内比较字符串?

圆酱3

如何安全地比较两个有界长度的字符串,以使每个比较花费相同的时间?不幸的是,散列具有定时攻击漏洞。

有没有什么方法可以比较两个字符串而不散列呢?

马修M.

TL; DR:使用程序集。


恒定时间代码确实很难实现。要真正保持恒定的时间,您需要:

  • 恒定时间算法
  • 所述算法的恒定时间实现。

“恒定时间算法”是什么意思?

字符串比较的例子很棒。在大多数情况下,您希望比较花费的时间越少越好,这意味着要对第一个差异有所帮助:

fn simple_compare(a: &str, b: &str) -> bool {
    if a.len() != b.len() { return false; }

    for (a, b) in a.bytes().zip(b.bytes()) {
        if a != b { return false; }
    }

    true
}

但是,无论输入如何,恒定时间版本算法版本都应具有恒定时间:

  • 输入应始终具有相同的大小,
  • 无论差异位于何处(如果有),计算结果所用的时间应相同。

Lukas给出的算法几乎是正确的:

/// Prerequisite: a.len() == b.len()
fn ct_compare(a: &str, b: &str) -> bool {
    debug_assert!(a.len() == b.len());

    a.bytes().zip(b.bytes())
        .fold(0, |acc, (a, b)| acc | (a ^ b) ) == 0
}

“恒定时间实施”是什么意思?

即使算法是恒定时间,实现也可能不是。

如果未使用完全相同的CPU指令序列,则在某些体系结构上,其中一条指令可能会更快,而另一条指令会更慢,并且实现会丢失。

如果该算法使用表查找,则可能会有更多或更少的缓存未命中。


您可以在Rust中编写恒定时间的字符串比较实现吗?

没有

Rust语言可能适合该任务,但是其工具链不适合

  • LLVM优化器会对您的算法造成严重破坏,将其短路,从而消除现在或将来的不必要读取,
  • LLVM后端会对您的实施造成严重破坏,选择不同的说明。

总之,今天,从Rust访问恒定时间实现的唯一方法是在汇编中编写所述实现。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

恒定时间内的字符串比较

字符串pop_back如何在恒定时间内实现?

如何在固定时间内替换字符串中的单个字符且不占用额外空间?

如何在固定时间内返回下标?

如何在固定时间内更改按钮的backColor?

如何在字符串和整点时间内替换时间戳?

如何在合理的时间内将绝对大数转换为字符串?

如何使用termcolor模块中的有色函数使字符串在指定时间内闪烁?[Python 2.7]

Ruby中更快的固定时间字符串比较

如何在预定时间内发送报告

如何在一定时间内循环播放?

如何在一定时间内运行代码?

如何在特定时间内锁定Android设备?

如何在特定时间内执行方法?

如何在恒定时间内获取每个元素?

如何在固定的时间内使用javascript函数?

如何在伪多项式时间内从文本字符串表中找到字符串的最佳编码?

在固定时间内接收多个输入

如何在给定时间内重新加载ajax调用函数

如何在 Tkinter Text 小部件中限制仅在指定时间内输入文本

如何在指定时间内使用cassandra将数据导出到csv?

如何在Debian中阻止cron作业在特定时间内运行?(“游戏” /“表演模式”)

如何在一定时间内暂停进程?

如何在恒定时间内在N大小的列表中查找整数?

vector :: size()如何在恒定时间内返回向量的大小?

如何在不同的指定时间内显示不同的组件?

使用Rails如何在给定时间内查找用户预订的课程

如何在指定时间内获取curl请求的HTML

如何在python中使Tkinter在一定时间内完成每个代码?