Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >这个恒定时间比较安全吗?

这个恒定时间比较安全吗?
EN

Cryptography用户
提问于 2021-03-03 19:48:27
回答 1查看 133关注 0票数 1

当我想到一种简单的方法,那就是恒时比较,它和"==“有什么不同。作为密码学的初学者,我想知道我的方法是否安全。这个方法可能不安全,但我想知道它的弱点在哪里。真的很简单。

  1. 取两个字符串进行比较,将每个字符串转换为一个数字列表(0-255)。
  2. 设置totalDifference = 0
  3. 从第一个列表中取第一个数字,并从第二个列表中的第一个数字中减去它。利用这个差异并将其添加到totalDifference中。
  4. 对两个列表中的每个字符/数字执行4。
  5. 如果totalDifference在遍历每个数字之后为0,那么两个字符串都是相等的。

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 [1,3,5,9,7,8]
-[1,3,5,5,7,8]
--------------
  0,0,0,4,0,0


0+0+0+4+0+0!=0, so strings not equal

这个恒定时间比较方案有什么问题吗?

EN

回答 1

Cryptography用户

回答已采纳

发布于 2021-03-03 20:00:29

这个恒定时间比较方案有什么问题吗?

一个明显的问题是,它会声称字符串"AB“和"BA”是相同的;在第一个字符中,它将看到'A'-'B‘= -1,对于第二个字符,它将看到'B'-'A’= 1;这两个和为0。

另一方面,这实际上非常接近于对相等字符串进行恒定时间比较的标准方法,但是与其将差异相加,我们更明智地或它们,如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
total_difference = 0;
for (i=0; i<len_strings; i++) {
    int this_difference = a[i] - b[i];
    total_difference = total_difference | this_difference;
          /* | is the bit-wise or operator */
}
if (total_difference == 0) {
    /* The strings are the same */
}

这里的想法是“或”操作可以在total_difference中设置位,但永远不会清除它们。因此,在结束时total_difference是0的唯一方法是,如果在每次迭代中,this_difference总是0,则如果字符串a的每个字符与字符串b中的字符相同,则会发生这种情况。

通常,您会看到this_difference是按位-xor而不是减法计算的;该算法的工作方式是相同的。

票数 3
EN
页面原文内容由Cryptography提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://crypto.stackexchange.com/questions/88612

复制
相关文章
Excel 检查间隔恒定的时间点是否有缺失
在 Excel 中有一列日期时间数据,按小时顺序记录了一些时间点,但是这个记录是不完整的。其中有些时间点会被重复记录,如下图的 2020/1/6 1:00。而另一些时间点则可能缺失,比如 2020/1/6 4:00,部分数据截图如下:
朱迪
2024/04/26
1890
python比较时间大小
解释:python中字符串的大小比较,是按照字符顺序,从前往后依次比较字符的ASCII数值,例如‘abc’要小于‘abd’。因此,时间字符串也可以直接比大小。
py3study
2020/01/10
4.9K0
[C#] 巧用ToString 比较时间。
可以使用 DateTime 类型的 ToString 方法将时间转换为字符串,然后比较字符串是否相等来判断时间的各个部分是否发生了变化。
科控物联
2023/11/02
1950
[C#] 巧用ToString 比较时间。
java 获取当前系统时间 时间比较
import java.util.Date; import java.text.SimpleDateFormat;
全栈程序员站长
2022/11/02
2.7K0
从时间这个概念说起
我们每个人都知道时间,也都在使用时间。同事之间要聚会了,会互相通知今晚七点不见不散,过了两小时,吃饱喝足了,聚会也就散了。“今晚七点”和“过了两小时”代表着日常使用时间的两个方面,时刻和持续时间。
哒呵呵
2021/11/30
2800
golang 时间戳获取、类型转换、时间比较
time.ParseDuration()函数参数的有效时间单位为“ns”、“us”(或“µs”)、“ms”、“s”、“m”、“h”。该函数返回一个 Duration 对象,配合time的Add()方法使用,可以获取相差指定区间的时间。这个函数假设没有润秒。后面需要验证下会不会有闰年这种考虑。
IT工作者
2022/07/08
2.5K0
mysql 字段时间类型的比较
字段的时间类型分为: ,,,,; 下面就分别介绍这几种时间类型的区别 每个时间类型都有一个有效范围和一个零值,当指定的类型的值超过有效范围时,就会使用零值 YEAR 该类型表示年,格式为 有三种表示方法 直接使用四位数字或字符串,范围是1901-2155,输入的格式为’YYYY’或YYYY,如输入‘2011’或2011就回直接保存为2011,若超过范围就会表示为0000 使用两位的字符串表示,如果插入为’00’-‘69’则表示为2000-2069,若插入’70-99’则表示为1970-1999.如输入’
企鹅号小编
2018/02/08
4.7K0
mysql 字段时间类型的比较
线性时间非比较类排序
原理:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。
忧愁的chafry
2022/10/30
9930
线性时间非比较类排序
jquery 时间比较大小
六月的雨在Tencent
2024/03/28
2030
python实现时间的比较
下面介绍下Python中比较两个日期大小的脚本. 在实际工作中用到,以供后续参考及备忘 时间区间比较函数 import time # 这里比较l_time 是否在时间区间[start_t, end_t]中 def compare_time(l_time,start_t,end_t):     s_time = time.mktime(time.strptime(start_t,'%Y%m%d%H%M')) # get the seconds for specify date     e_time = time.mktime(time.strptime(end_t,'%Y%m%d%H%M'))     log_time = time.mktime(time.strptime(l_time,'%Y-%m-%d %H:%M:%S'))     if (float(log_time) >= float(s_time)) and (float(log_time) <= float(e_time)):         return True     return False # 在用mktime时,注意import time 模块,否则会提示找不到改attribute.   输入的时间格式必须跟自己的格式化串保持一致. 如时间: "2011-11-10 14:56:58"  定义格式串时应该为: "%Y-%m-%d %H:%M:%S" 有试过 from datetim import datetime,time , 但是没有成功,暂时没有考虑去解决.
py3study
2020/01/10
1.7K0
js中比较时间字串大小
var start = Date.parse($("#str_atBeginDate").val().replace("-","/")); var end = Date.parse($("#str_atTermDate").val().replace("-","/")); <!-- var start = new Date($("#str_atBeginDate").val()).getTime();--> <!-- var end = new Date($("#str_atTermDate").
微风-- 轻许--
2022/04/13
4.9K0
jdk8获取当前时间|时间加减|java8时间格式化|时间处理工具|时间比较|线程安全的时间处理方法
在很久之前,我总结了一些jdk7版本之前的关于时间处理的一些公共方法,日期转换成字符串、指定时间加上指定天数后的日期、获取上周周一时间 等等;具体的可以戳链接查看完整的:https://blog.csdn.net/qq_27471405/article/details/79523556
小小鱼儿小小林
2020/06/24
7.4K0
jdk8获取当前时间|时间加减|java8时间格式化|时间处理工具|时间比较|线程安全的时间处理方法
CAML中比较日期时间类型
在做Sharepoint的列表查询的时候,经常要用到CAML,今天我在做一个工作流授权列表的查询,里面要求根据人员、工作流名称、授权开始时间和授权结束时间找到对应的授权人,没有找到就返回本人。使用CAML QueryBuilder生成了查询,然后修改了其中的对应的变量,进行查询。结果发现查询结果有问题。原来是在CAML中使用的日期类型的表示必须是一种国内很少用的特殊的格式,,形如"2009-04-09T15:11:20Z"网上找了一下,使用SPUtility.CreateISO8601DateTimeFromSystemDateTime
深蓝studyzy
2022/06/16
1.8K0
别再用大小比较时间了
由于写代码习惯了基本数据类型(int/Integer、long等)大小的比较,很多人连Date的时间先后比较也用大小(>、<、>=、<=)了。
程序大视界
2020/08/17
4.8K0
java时间类型比较大小
在java中通常会用到时间的比较,一般情况下都是用Date类型的进行比较,如果有Timestamp类型的需要转成Date类型,在前面有一篇文章介绍的是Java Timestamp、Date和String之间的相互转化,不知道如何转换的朋友可以去看一下。下面我来说一下如何进行Date类型之间的时间比较
OECOM
2020/07/01
1.8K0
这个AI模型能识别出这个橘子吗?
图像识别任务是人工智能计算机视觉领域一个重要的子任务,本篇文章将通过使用一个预训练模型来帮助读者快速上手图像识别任务,对应的文件可通过关注文章末尾的公众号领取
Nowl
2024/01/18
1170
这个AI模型能识别出这个橘子吗?
ThreadLocalRandom 安全吗
最近在写一些业务代码时遇到一个需要产生随机数的场景,这时自然想到 jdk 包里的 Random 类。但出于对性能的极致追求,就考虑使用 ThreadLocalRandom 类进行优化,在查看 ThreadLocalRandom 实现的过程中,又追了下 Unsafe 有部分代码,整个流程下来,学到了不少东西,也通过搜索和提问解决了很多疑惑,于是总结成本文。
烂猪皮
2020/11/02
9690
你安全吗?
近日新上线了一个电视剧以信息安全为主题,男主是一个信息安全方面的专家,作为安全顾问协助警方办案,自己开了一个工作室,承接各类需求,只要能联网就没有解决不了的问题,而且还获得了 CISP 认证,是一个正规的安全专家:
信安之路
2022/10/04
1K0
你安全吗?
空字符串用equals比较的时间和==(等等于)比较的时间哪个更快
今天测试了一下空字符串比较的时间和==(等等于)比较的时间哪个更快,最后发现equals会比较快,
小小鱼儿小小林
2020/06/23
1.1K0
这个坑你能填吗?
今天利用java发邮件,本地windows上测试时发送ok的,部署到服务器上却报异常,让我们走进异常,探索到底坑在哪里,并填之。
我的小碗汤
2018/08/22
9230
这个坑你能填吗?

相似问题

这个密码安全吗?

10

这个算法安全吗?

10

这个排列安全吗?

20

为什么不在恒定时间比较中使用`<`、`>`或`==`?

10

这个聊天协议安全吗?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文