C中的64位散列/摘要

Man*_*ana 3 c encryption hash openssl

我试图找出C中是否有任何用于计算64位哈希的API.我发现有些人使用前64位的MD5/SHA1等.这是一个好方法吗?

emb*_*oss 5

您可以尝试将SipHash作为MAC(这需要密钥管理).它特别适用于短输入消息,并以加密强度为目标.AC 实施也可用.

但是,如果你真的关心某人积极搞乱你的文件,你不应该限制自己64位的安全性.如果有足够的时间和资源,今天甚至可以通过暴力破解64位.您应该使用SHA-256或更强.或者让我反过来说明,将破碎的选项列入黑名单:不要使用MD5(或MD-anything).仅在由于某种原因不能使用SHA-256时才使用SHA-1.

使用散列还具有以下优点:您不需要管理任何密钥(与使用MAC相反).您应该将计算的哈希值保存在与要监视的文件不同的位置 - 否则有人篡改您的文件也会轻易篡改校验和.

关于截断哈希是好还是坏

从理论上讲,无论你是采用最高有效位还是最低有效位或者使用任意模式选择它们,我都不明白为什么将一个160位的哈希值截断到64位是错误的.我没想到这个问题的唯一原因就是效率 - 如果有更有效的算法来处理较小的问题,为什么要带上大枪.

在下文中,我假设为此目的使用加密安全哈希,通用哈希是一个完全不同的主题 - 它们可能会在我所知道的截断时暴露攻击面.

但是,对于加密安全散列,除非算法被破坏,否则我们可以假设其输出与均匀分布的随机变量的输出无法区分.

如果我们现在截断这个值,我们不会进一步深入了解算法的内部工作原理.尽管如此,我们确实通过一个简单的事实削弱了安全性,即强迫(无论是冲突还是寻找前图像)现在通过概率法则花费的时间更少.

例如,找到64位哈希的冲突平均需要大约2 ^ 32次尝试 - 生日悖论说.如果将输出截断为原始64位散列的最低32位,那么您将发现大约2 ^ 16的时间冲突,因为您只是忽略了最重要的32位,其余的事实均匀分布 - 就像你开始首先搜索具有32位值的冲突一样.