为什么需要对 MD5 哈希字符串进行编码?显示未编码是否不安全?
散列函数输出二进制数据,通常为字节数组。这不能正确显示,因此,您需要编码。
传输二进制数据可能会产生问题,尤其是在旨在处理文本数据的协议中。为了完全避免它,我们不传输二进制数据。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)字节。如果将其视为文本,则结果很可能包含不可打印的字符,因此您必须有某种编码方案将散列结果映射到可打印字符的空间。
现在仍然存在安全问题。如果您确实尝试将原始位打印出来,就好像它们是字符一样,那么位模式可能会产生不需要的(和不安全的)结果。但实际上它是以准确(且可恢复/可重现)的方式传达模式。