hash 算法

我知道有些说法称 MD5 是“加密”算法,但也是后来才看到有教程说是“非对称加密”算法。 孔子说:“先正名。”MD5 当然不是加密算法,而是“哈希”算法(hash 也可译作“散列”“杂凑”)。MD5 是不可逆的,于是有人说是“不可逆的加密”算法。不可逆加密?不能解密算哪门子加密?更不能因为“不可逆”就说它是“非对称”加密。非对称加密是指用来加密、解密的密钥不同。比如在 RSA 及其变种中,我们用“公钥”加密,用“私钥”解密。而“对称”加密算法,加密密钥同时也用于解密。

哈希算法基本是将“变长”的数据(称作“原文”)转变为“定长”数据(即“哈希值”),或其他固定格式。根据这种定义,你我都可构造出相当多哈希函数。类似 CRC32 这种校验码生成算法也可被认为是哈希函数,但显然我们能轻易构造两个原文拥有相同哈希值(称作“碰撞”),也能通过哈希值推断原文的特性。在实际场景中我们会特指密码学哈希函数(cryptographic hash function),这就要求哈希函数还要有其他特性,如防碰撞。MD5 就属于密码学哈希函数。 当然,这里 MD5 纯粹是为行文方便。MD5 的碰撞已被证明现实可行。为了安全,应当使用 SHA-2 等替代。

(原发于 QQ空间 2021-01-21 18:00:10)

上条说说有人拿非密码学哈希算法(non-cryptographic hash algorithm)说是最强,我说只是快。当然密码学、非密码学哈希算法应用场景不一样。但若是没限定,我肯定戴上有色眼镜,说或许很强,但不是最强。

毕竟我们都同意,9字符口令比6字符口令更强,128位 MD5 比64位 MD5 更强。XOR(异或)加密它不快吗?超快的。甚至只要使用得当,可获得“完美保密性”(perfect secrecy)。但实际上稍微注重安全性的地方都不会(只)使用 XOR 加密。某某 hash 虽然很快,也有一定防碰撞性,但归根到底只能有效应对偶然的、自然的数据差异,不能防止有人恶意构造碰撞。强行当成银弹使用,构造哈希表怕是会招来拒绝服务攻击(denial-of-service attack),用来存储密码(口令)泄露以后怕是不需要原文也能登录该站甚至其他网站……

说来跟其他事物一样,在密码学领域“快”和“强”也经常是矛盾的。非密码学哈希算法当然很快,但你再快也不是密码学哈希算法。密码学算法就是慢,我们接受这种慢,甚至我们会刻意制造慢。

在数据库哈希存储密码(口令)时,我们会加“盐”,甚至会多次迭代,拖慢执行速度。即便这样,执行一次的时间也是可以接受的,重要的是累积下来大量执行会慢到不可接受,因而能防止彩虹表攻击。在压缩软件里,输入一个密码(口令,或 passphrase),软件会默默帮你“展开”成加密算法的密钥。这种称作 key stretching 的过程经常用到 PBKDF2 之类的算法,迭代次数一万不算多。在另一些情况下,会调用占大量内存的哈希算法。这些都是为了增加暴力破解的成本。

说到底,我们现在流行的密码学应用,基本是取得有限时间内的安全性。我们希望将这个有限时间延长到令人望而却步,例如两百年内不可破解,正是“慢”与“久”让我们获得安全感,觉得算法很“强”。当然咯,也不应过度追求安全,“快”也很必要。

(原发于 QQ空间 2021-01-21 22:24:42)

Try Ctrl+Enter :)