当前位置: 首页 > 知识库问答 >
问题:

使用加密哈希函数前后

彭建业
2023-03-14

在查看了用于生成 Java MD5 和 SHA* 哈希的多个在线参考后,我注意到纯文本(文件字符串)之前经历了某些准备

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

丹科!

共有2个答案

羊浩广
2023-03-14

这些哈希算法的实现工作在字节上,而不是字符串字符。这就是为什么您需要将所有内容转换为字节形式。

柴浩大
2023-03-14

这有两部分:

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

第一个答案是摘要只对字节数组有效。他们不知道字符串、数字或任何其他数据类型。只有字节。因此,我们获取一个< code>String对象,并使用某种形式的文本编码(如UTF-8)将其转换为一个字节数组。

注意,编码很重要:我可以用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编码的摘要变成一个字节数组,其值如下:427125822907(对于我虚构的8字节摘要函数)。如果我试图将其解释为UTF-8字符串,那么我会得到很多垃圾:0不是可打印字符。用十六进制编码意味着我可以以有意义的方式打印出来,或者将其添加到我的PGP电子邮件中,或者其他任何方式。

这有意义吗?

 类似资料:
  • 简介 Laravel Hash facade 为存储用户密码提供了安全的 Bcrypt 和 Argon2 哈希。如果您使用 Laravel 应用程序中内置的 LoginController 和 RegisterController 类,则默认情况下它们将使用 Bcrypt 进行注册和身份验证。 {tip} Bcrypt 是哈希密码的理想选择,因为它的「加密系数」可以任意调整,这意味着生成哈希所需的

  • 我是在阅读了一些关于php中会话管理的主题后开始进行安全讨论的,请查看:https://paragonie.com/blog/2015/04/secure-authentication-php-with-long-termer-persistence#title.2 引自章节:胡椒还是不胡椒? 一个更好的解决方案是,在将散列插入数据库之前对其进行加密,如果使用硬件分离,这种解决方案尤其有用。有了这

  • 是否存在线性加密哈希函数? 所谓线性,我是指函数“f”,这样: 对于某个大常数 n,mod n 在哪里

  • 问题内容: 我感觉自己快要到了,但是对异步的不完全理解使我无法解决这个问题。我基本上是在尝试使用bcrypt哈希密码,并决定将hashPassword函数分离出来,以便可以在应用程序的其他部分中使用它。 不断返回undefined … 问题答案: 剂量等待因为不退诺。请使用以下方法,该方法将Promise包裹起来才能使用。

  • 每个人在建构 PHP 应用时终究都会加入用户登录的模块。用户的帐号及密码会被储存在数据库中,在登录时用来验证用户。 在存储密码前正确的 哈希密码 是非常重要的。密码的哈希操作是单向不可逆的,该哈希值是一段固定长度的字符串且无法逆向推算出原始密码。这就代表你可以哈希另一串密码,来比较两者是否是同一个密码,但又无需知道原始的密码。如果你不将密码哈希,那么当未授权的第三者进入你的数据库时,所有用户的帐号

  • 我正在尝试编写一个C程序,使用哈希表来存储不同的单词,我需要一些帮助。 首先,我创建一个哈希表,其大小为最接近我必须存储的单词数的素数,然后我使用一个哈希函数为每个单词找到一个地址。我从最简单的函数开始,把字母加在一起,结果有88%的碰撞。然后我开始实验这个函数,发现无论我把它改成什么,碰撞都不会低于35%。现在我在用 这只是我想出来的一个随机函数,但它给了我最好的结果--大约35%的碰撞。 在过