【发布时间】:2010-12-27 05:06:22
【问题描述】:
许多在线示例将哈希显示为十六进制表示,它们通常是自定义实现。改用 Apache Commons Base64 编码有什么问题或安全性降低吗?在阅读有关编码时,通常是在如何将二进制表示为 XML 中的文本的领域内,但不一定讨论安全问题……只是压缩的工作原理。
在一个相关问题上,为什么要全部编码,因为数据库具有二进制类型,可能会将加密保存为二进制?因此,如果我要存储密码,为什么不将其存储在其本机类型中呢?
【问题讨论】:
许多在线示例将哈希显示为十六进制表示,它们通常是自定义实现。改用 Apache Commons Base64 编码有什么问题或安全性降低吗?在阅读有关编码时,通常是在如何将二进制表示为 XML 中的文本的领域内,但不一定讨论安全问题……只是压缩的工作原理。
在一个相关问题上,为什么要全部编码,因为数据库具有二进制类型,可能会将加密保存为二进制?因此,如果我要存储密码,为什么不将其存储在其本机类型中呢?
【问题讨论】:
编码仅影响数据的表示,而不影响其安全性。所以,如果你发送一个未加密的密码并使用某种形式的编码,你并没有让它变得更安全。同样,如果您获取一些高度加密的文本,然后以某种编码方案表示它,那也不会降低它的安全性。通常,使用这种编码形式的原因是使用协议(例如 SMTP)发送二进制数据,该协议只能支持 7 位 ASCII 文本。另一个用途是在 URL 中,其中 URL 可以支持的字符集是有限的,但您可能希望在该 URL 中放置任意复杂的二进制数据(例如某种验证签名)。
【讨论】:
一点也不。它只是一种表示 ASCII 中相同位的编码。当您必须通过仅处理文本的通信路径存储或传输二进制数据时,它最有用。现代示例包括电子邮件和 Web 界面。您也不能将二进制形式发送到终端以查看它,因为它会导致垃圾或奇怪的终端行为。
如果您可以安全地将位存储在数据库中的二进制 blob 中,则没有理由使用 base64 进行编码。但是,如果您不这样做,将很难查看它。您必须先将其转换回文本表单。
【讨论】:
好吧,我们通常不会很好地阅读二进制文件,而十六进制是它的更好替代品。我希望您已链接到您引用的文章,这样其他人就可以直接了解您正在形成的观点。
我不明白为什么他们会使用 Base64 而不是 hex,但我假设这是因为 hex 是 16 位而 Base64 是更多,因此生成了更紧凑的实际版本hash ;) ~ 我们人类倾向于一次更好地吸收少量数据。
【讨论】:
不,因为 Base64 是 1:1 编码(即,对于每个输入,只有一个 base64 编码输出,反之亦然),base64 编码 SHA1 哈希与十六进制编码一样“安全” (或二进制编码,就此而言)散列。
只有当编码允许多个哈希编码为同一个字符串或多个字符串解码为同一个哈希时,编码才会使哈希不安全。
【讨论】: