不久前,我发现了比较两个字符串并返回bool值的该函数(不幸的是,我不记得它的来源,很可能来自某些Python框架)。了解这里发生的事情非常简单。如果不匹配,则在char之间查找xor将返回1(真)。
def cmp_strings(str1, str2):
return len(str1) == len(str2) and sum(ord(x)^ord(y) for x, y in zip(str1, str2)) == 0
但是为什么要使用此功能?与str1==str2
不一样吗?
比较相似长度的任何字符串需要花费相似的时间。当字符串敏感时,用于安全性。通常,它用于比较密码哈希。
如果使用==
,则当找到第一个不匹配的字符时,Python将停止比较字符。这对散列是不利的,因为它可以揭示散列与匹配的接近程度。这将有助于攻击者暴力破解密码。
这是hmac.compare_digest
的工作方式。
如果字符串的长度相同,则似乎在字符串之间进行了字符相关(XOR和)。在您需要了解“相似性”而不是平等的情况下,可能需要使用它。也许那是计划。作者可能想要进一步扩展此功能。
如果字符串长度相同,似乎在字符串之间进行了字符相关(XOR和)。在您需要了解“相似性”而不是平等的情况下可能需要使用它。也许那是计划。作者可能想要进一步扩展此功能。