Python中的整数比较是常数时间吗?

Python中的整数比较是常数时间吗?,python,cryptography,Python,Cryptography,Python中的整数比较是常数时间吗?我是否可以使用它来比较用户提供的int令牌与存储的int加密服务器,就像我比较字符串与django.utils.crypto中的常量时间\u compare一样,也就是说,不受定时攻击 或者,转换为字符串然后使用上述函数是否更安全?对于给定大小的整数,答案是肯定的——默认情况下,变大的python整数变为长的,然后可能具有无限长的长度——比较时间随大小而增长。如果将整数的大小限制为actypes.c_uint64或ctypes.c_uint32,则不会出现这

Python中的整数比较是常数时间吗?我是否可以使用它来比较用户提供的
int
令牌与存储的
int
加密服务器,就像我比较字符串与
django.utils.crypto
中的
常量时间\u compare
一样,也就是说,不受定时攻击


或者,转换为字符串然后使用上述函数是否更安全?

对于给定大小的整数,答案是肯定的——默认情况下,变大的python整数变为
长的
,然后可能具有无限长的长度——比较时间随大小而增长。如果将整数的大小限制为a
ctypes.c_uint64
ctypes.c_uint32
,则不会出现这种情况


请注意,与0相比是一种特殊情况,通常速度要快得多,因为硬件操作很多CPU都有一个0的特殊标志,但是如果使用/允许种子或令牌的值为0,那就是自找麻烦。

您的问题是:
1==4
O(1)?(这与Django有什么关系?)我的问题是1==4这个短语真正意义上的恒定时间(我认为从技术上讲,它可以是O(1),但对于不同的输入,时间的变化是可以预测的)。和re:Django-我写了一个较长的问题,关于Django.utils.crypto中定义的常量_time_compare函数,但为了简洁起见,我对它进行了修剪,忘记删除Django标签。谢谢这不是我的领域,所以我在这里可能有点离谱,但似乎计时攻击背后的想法是利用这样一个事实,即检查两个位字符串的相等性通常是“短路”:如果我有两个在第一位不同的位字符串,比较返回的速度比它们相同(最多10000位)时快,但在第10001点上有所不同。那么,python整数比较(对于给定数量的位)所用的时间是否确实是相同的,而不管整数是在第一位不同还是仅在最后一位不同?这似乎是一个令人惊讶的实现@在硬件层,事情通常是由处理器字宽来完成的,因此==的最快和最常见的实现是加载两个字、XOR和检查0,为字比较生成总共4个操作码——正如我上面所说的,如果寄存器包含0,则大多数处理器都有一个硬件标志。因此,只要你的字宽小于一个整数,而python的字长是无限长的,那么它就是一个常数时间。相比之下,它可以按照你的建议工作,但不是按位工作,而是按字工作。比较一个long总是需要最长的时间来匹配长度。在这种情况下,我认为人们不太经常使用int来表示HMAC和令牌,因为您很可能希望使用超过64位的熵。。。在我的例子中,我的令牌是64位整数,因此我将使用常规整数比较,而不担心定时攻击。谢谢@史蒂文斯·巴恩斯:啊,这是有道理的。有趣。谢谢比较时间当然会随着大小而增长,但对于给定的大小,它不能保证是恒定的时间。如果您使用的是32位python和64位数字呢?只需使用已知的恒定时间函数,不要试图以危险的方式进行微观优化。