String 运行时不使用';不依赖于数据内容

String 运行时不使用';不依赖于数据内容,string,language-agnostic,String,Language Agnostic,有一种经典算法可以在防止定时攻击的同时检查两个相同长度的字符串是否相等 foldl bitwiseOr 0 (zipWith bitwiseXor firstString secondString) == 0 在这种情况下,恶意用户会让计算机将隐藏的秘密字符串与输入字符串进行比较,并报告它们是否相同。例如,考虑密码密码攻击,其中密码被加密但不散列。如果有更多的初始字符匹配,则需要更长的时间来确定密码不匹配,如果用户可以测量效果,他们可以从头到尾逐步猜测密码 但是有没有什么通用算法可以回答哪个字

有一种经典算法可以在防止定时攻击的同时检查两个相同长度的字符串是否相等

foldl bitwiseOr 0 (zipWith bitwiseXor firstString secondString) == 0
在这种情况下,恶意用户会让计算机将隐藏的秘密字符串与输入字符串进行比较,并报告它们是否相同。例如,考虑密码密码攻击,其中密码被加密但不散列。如果有更多的初始字符匹配,则需要更长的时间来确定密码不匹配,如果用户可以测量效果,他们可以从头到尾逐步猜测密码


但是有没有什么通用算法可以回答哪个字符串更大,或者如果它们相等,那么可以抵抗这样的攻击呢?

应该可以通过提前退出来调整任何通用算法,以满足要求。但这很棘手,因为如果CPU能够发现您只是在徒劳地旋转,那么它将更快地执行代码

最安全的设计是消除循环中的所有分支。如果不允许使用
和&
|
,则不允许使用
,只允许使用位运算符

对于排序
strcmp
,我们希望记住字符串之间的第一个差异以及哪一侧更大。因此,根据是否发现差异,算法自然会做完全不同的事情。我们可以使用位掩码模拟分支

int模糊\u strcmp(字符常量*l,字符常量*r){
int结果=0;
做{
//计算结果以备需要
int diff=*r-*l;//如果l0;//如果l
是的,也许恒定时间不是一个好术语。实际上,我指的不是每个字符串都有相同的时间,而是一个算法,它对每个长度相同的字符串都有相同的时间。我在好几个地方看到过这个术语,例如在@FedorGogolev中,你需要阅读“大O符号”。它是计算机科学中的一个基本概念,应该在任何入门课程中教授。不幸的是,维基百科的文章似乎写得不太通俗易懂,我手头也没有好的资源。至于链接的消息来源,提到“恒定时间”的评论用的是蹩脚的英语,术语完全是非正统的。是的,我知道你在说什么。我将用你的评论更新这个问题。@FedorGogolev很抱歉脾气暴躁……我正试图想出一个合适的算法。同时,这里是基本方法的概要。@FedorGogolev感谢这个有趣的问题。顺便说一下,现在我看到我的算法在到达较短字符串的末尾后退出,从而显示密码的长度。您应该按照链接的Apple代码将字符串填充到给定长度
n