为什么需要对 MD5 哈希字符串进行编码?显示未编码是否不安全?

信息安全 哈希 md5 编码
2021-09-07 18:30:28

我正在阅读这篇关于缩短 URL 的设计的文章,在设计部分中,它说给定的 URL 可以使用诸如 MD5 之类的散列算法进行散列,然后使用 base64 或类似编码进行编码以用于显示目的。

我很困惑为什么我们需要对散列字符串进行编码。显示 MD5 哈希是否不安全,或者还有其他好处吗?任何人都可以对此有所了解吗?我尝试在线搜索,很多页面都在谈论加密等,但不是关于上述情况。

4个回答

散列函数输出二进制数据,通常为字节数组。这不能正确显示,因此,您需要编码。

传输二进制数据可能会产生问题,尤其是在旨在处理文本数据的协议中。为了完全避免它,我们不传输二进制数据。Stack Overflow 上与加密相关的许多编程错误都是由于通过基于文本的协议发送二进制数据造成的。大多数情况下这是可行的,但有时它会失败,并且编码人员想知道这个问题。二进制数据会破坏网络协议。

因此,需要 hex、base64 或类似的编码来缓解这种情况。Base64 并不完全是URL 安全的,只需一点工作就可以使其成为URL 安全的。

另一方面,字符编码是可逆的,不需要加密密钥。这与安全无关它是关于可见性互操作性的。

您看到的 MD5 哈希是它的十六进制编码版本。哈希本身是二进制的,但我们通常不喜欢在屏幕上看到二进制数据。另一种显示哈希的方法是使用 Base64,因此所有字符都是可打印的。

加密字符串也是二进制的,因此您也需要将它们编码为 base64。或者,如果您想要复古编码,请尝试使用 uuencode。

虽然其他答案包含大量有用的信息,但我认为他们错过了原点。这是一个 URL缩短器。所以长度是一个关键因素。MD5 哈希为您提供 128 个 1 和 0。在您的 url 中天真地使用那些 1 和 0 会使它不必要地长。使用 base 64 对这些 1 和 0 进行编码大大缩短了表示散列所需的字符数。

在文章中,他们甚至说明了如何只需要 64 个基数的 6 个字符就可以产生 687 亿种可能性。

实现相同数量的可能性需要 36 个二进制字符。

显示未编码是否不安全?

问题在于安全,至少在你问的方式上。问题是哈希算法的实际结果是二进制的Md5 产生 128 位(16 字节)的数据,但这些不是 ascii(甚至 Unicode)字节。如果将其视为文本,则结果很可能包含不可打印的字符,因此您必须有某种编码方案将散列结果映射到可打印字符的空间。

现在仍然存在安全问题。如果您确实尝试将原始位打印出来,就好像它们是字符一样,那么位模式可能会产生不需要的(和不安全的)结果。但实际上它是以准确(且可恢复/可重现)的方式传达模式。