首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用加密哈希函数之前和之后

使用加密哈希函数之前和之后
EN

Stack Overflow用户
提问于 2013-03-19 11:41:20
回答 2查看 956关注 0票数 4

在查看了生成Java和SHA*散列的多个在线参考之后,我注意到纯文本(String of MD5 )在被提供给Digest对象以生成散列之前和之后经历了一定的准备。具体地说,首先将数据转换为字节数组,然后将其提供给摘要,然后将输出哈希转换为十六进制流。为什么要进行这些字节和十六进制的转换?

PS:我想答案与Java和Digest对象如何工作有关,我问这个问题的动机是为了理解这个行为,并可能获得一些文档/文献的参考资料来深入解释这一点。

丹克!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-19 11:49:16

这包括两个部分:

  1. 为什么要在摘要之前将字符串转换为字节数组?
  2. 为什么要将摘要转换为十六进制?

第一个答案是,摘要只有才能处理字节数组。他们不了解字符串、数字或任何其他数据类型。只有字节。因此,我们获取一个String对象,并使用某种形式的文本编码将其转换为字节数组。

注意,编码很重要:我可以用UTF-8、UTF-16、US-ASCII或任何数量的其他编码对字符串"hello world“进行编码。如果我选择UTF-8,它将生成11字节的输出(因为"hello world“的长度是11个字符),但UTF-16将生成22字节的输出。这两种编码将产生不同的摘要,因此了解编码是至关重要的。

第二个答案是,摘要通常用于基于字符串的协议,如HTTP cookie,用于在数据库的文本列中存储密码散列,用于向电子邮件消息添加PGP签名等。

由于摘要生成一个原始字节数组,因此需要将其重新编码为文本友好的内容。这就是使用十六进制(或者更可能是base-64)的原因。

例如,继续使用"hello world“示例,假设UTF-8编码的摘要转换为具有下列值的字节数组:4 27 125 8 0 22 90 7 (对于我虚构的8字节摘要函数)。如果我试图将其解释为UTF-8字符串,那么我会得到很多垃圾信息:0不是一个可打印的字符。用十六进制编码意味着我可以以一种有意义的方式打印出来,或者将它添加到我的PGP电子邮件中,或者其他任何东西。

这有意义吗?

票数 5
EN

Stack Overflow用户

发布于 2013-03-19 11:46:38

这些散列算法的实现在字节上工作,而不是字符串字符之类的其他东西。这就是为什么你需要把所有东西都转换成字节的原因。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15491100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档