在 Java 中创建哈希的标准方法

2024-03-02

问题是关于在 Java 中创建哈希的正确方法: 假设我有一个积极的BigInteger我想从中创建哈希的值。让我们假设下面的实例messageDigest是一个有效的实例(SHA-256)

public static final BigInteger B = new BigInteger("BD0C61512C692C0CB6D041FA01BB152D4916A1E77AF46AE105393011BAF38964DC46A0670DD125B95A981652236F99D9B681CBF87837EC996C6DA04453728610D0C6DDB58B318885D7D82C7F8DEB75CE7BD4FBAA37089E6F9C6059F388838E7A00030B331EB76840910440B1B27AAEAEEB4012B7D7665238A8E3FB004B117B58", 16);

   byte[] byteArrayBBigInt = B.toByteArray();
   this.printArray(byteArrayBBigInt);
   messageDigest.reset();
   messageDigest.update(byteArrayBBigInt);
   byte[] outputBBigInt = messageDigest.digest();

现在我只假设下面的代码是正确的,因为根据测试,我生成的哈希值与以下生成的哈希值匹配:

http://www.fileformat.info/tool/hash.htm?hex=BD0C61512C692C0CB6D041FA01BB152D4916A1E77AF46AE105393011BAF38964DC46A0670DD125B95A981652236F99D9B681CBF87837EC99 6C6DA04453728610D0C6DDB58B318885D7D82C7F8DEB75CE7BD4FBAA37089E6F9C6059F388838E7A00030B331EB76840910440B1B27AAEAEEB4012B7D7665238A8E3FB0 04B117B58 http://www.fileformat.info/tool/hash.htm?hex=BD0C61512C692C0CB6D041FA01BB152D4916A1E77AF46AE105393011BAF38964DC46A0670DD125B95A981652236F99D9B681CBF87837EC996C6DA04453728610D0C6DDB58B318885D7D82C7F8DEB75CE7BD4FBAA37089E6F9C6059F388838E7A00030B331EB76840910440B1B27AAEAEEB4012B7D7665238A8E3FB004B117B58

但是我不确定我们为什么要执行以下步骤,即 因为在digest()调用之后返回的字节数组是有符号的,并且在这种情况下它是负数,所以我怀疑我们确实需要将其转换为正数,即我们可以使用这样的函数。

public static String byteArrayToHexString(byte[] b) {
    String result = "";
    for (int i=0; i < b.length; i++) {
      result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1);
    }
    return result;
}

thus:

String hex = byteArrayToHexString(outputBBigInt)
BigInteger unsignedBigInteger = new BigInteger(hex, 16);

当我构造一个BigInteger从新的十六进制字符串并将其转换回字节数组,然后我看到符号位(即最重要的位,即最左边的位)设置为 0,这意味着该数字是正数,而且整个字节是从零构造的(00000000)。

我的问题是:是否有任何 RFC 描述了为什么我们需要始终将哈希转换为“正”无符号字节数组。我的意思是,即使摘要调用后生成的数字为负数,它仍然是有效的哈希,对吧?那么为什么我们需要这个额外的程序呢?基本上,我正在寻找一篇论文:标准或 rfc 描述我们需要这样做。


哈希由一个八位字节字符串(在 Java 中称为字节数组)组成。如何将其转换为大数或大数转换为大数(aBigInteger在 Java 中)完全超出了加密哈希算法的范围。所以不,没有 RFC 来描述它,因为(通常)没有理由将哈希视为数字。从这个意义上说,加密哈希与Object.hashCode().

只能将十六进制视为无符号是一个问题,但如果您确实想要,那么您可以先将其转换回字节数组,然后执行new BigInteger(result)。该构造函数确实会威胁结果中签名的编码。请注意,在协议中通常不需要来回转换为十六进制;十六进制主要供人类使用,计算机可以使用字节。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Java 中创建哈希的标准方法 的相关文章

  • 使用 X509Certificate2 签署并验证 ECDSA-SHA256 签名

    I used OpenSSL使用创建 ECC 证书SHA256 现在我想使用这些证书来签署数据并验证现有签名 我尝试使用DSACryptoServiceProvider 但它只支持SHA1 or MD5 但似乎ECDsaCng能够支持ECD
  • 确定列表编号是否连续

    我在 Java 工作 我有一个无序列表 包含 5 个数字 范围从 0 100 没有重复 我想检测其中 3 个数字是否连续且没有间隙 例子 9 12 13 11 10 true 17 1 2 3 5 true 19 22 23 27 55 f
  • 将双精度转换为二进制表示形式?

    我尝试将双精度数转换为其二进制表示形式 但使用此Long toBinaryString Double doubleToRawLongBits d 没有帮助 因为我有大量数字 Long 无法存储它们 即2 900 Long toBinaryS
  • JCombobox 字符串项(可见)和整数键(固有)

    我有一个数据库模式 它将作为 JTable 列显示在 JCombobox 中以选择名称 但我希望将 ID 字段插入 作为外键 到另一个表中 通常 在下拉列表中选择一个项目 将所选项目带到组合框的显示区域 我想要做的是 当选择组合框中的任何项
  • 如何将 Struts 2 与 Velocity 和 Tiles 结合使用

    有人能够获得与 struts 2 一起使用的速度和图块吗 我在网上查找示例或教程时遇到一些问题 从我从邮件列表中收集到的信息来看 这似乎根本不可能 但邮件已经很旧了 https struts apache org docs tiles pl
  • Java OR 运算符优先级

    如何在 Java 中以 if 的方式链接条件语句b是假的 不如不检查c If a and c是假的 并且b是真的 确实c会被检查吗 if a b c 我正在寻找 PHP 所拥有的类似功能 但两者之间存在差异OR and 爪哇 如果左操作数是
  • 通过 Session.update 和 HibernateTemplate.merge 进行 Hibernate 更新的区别

    我看到了更新操作的类型 第一的 getHibernateTemplate execute new HibernateCallback public Object doInHibernate Session session session f
  • 将 Java 3D 坐标转换为 2D 屏幕坐标

    我正在使用一个名为 Walrus 的 Java 3D 应用程序 该应用程序用于显示有向图 该代码已经具有突出显示节点并在给定其屏幕坐标的情况下在图形中相邻绘制标签的功能 旋转屏幕后 该节点不再突出显示 我所拥有的是 3D 中的节点坐标 我需
  • 堆内存与对象内存

    根据一篇关于Java内存和特性的论文 内存分数分为两种类型 堆内存 即应用程序在运行时消耗的内存 对象内存 即程序中使用的各种对象分配的内存 例如整数和字符串等 他们的意思是stack当他们说时的记忆object记忆 或者它们是什么意思 很
  • 注释处理器可以用于代码生成吗?

    假设我定义了一个名为 MyAnnotation 有一个班级X其声明为 MyAnnotation class X 现在在编译时我想检查所有带有注释的类 MyAnnotation并对更多需要在同一进程中编译的 java 源文件进行一些代码生成
  • Java 中内存高效的稀疏数组

    关于时间高效的稀疏数组存在一些问题 但我正在寻找内存效率 我需要相当于List
  • 膨胀类 android.support.v7.internal.widget.NativeActionModeAwareLayout 时出错

    如果您以前解决过这个问题 请有人帮助我 我正在尝试使用材料设计制作一些东西 以便应用程序可以运行到 API 10 的低版本 我的代码中没有任何错误 但我不断收到此错误 Android 日志猫 06 01 05 05 37 414 E And
  • 使用枚举变量切换字符串

    我有一个具有不同值的枚举 并且想要切换字符串变量 现在 我在尝试将枚举值转换为字符串 可以用作大小写常量 时遇到了困难 我最好的尝试是将枚举转换为字符串数组 但开关似乎不接受数组值作为大小写常量 IntelliJ 说 需要恒定的表达 Enu
  • Jackson 中没有注释的多态反序列化

    我有一个CloudEvent
  • 码头无故停止

    我需要经验丰富的码头用户的建议 我在负载均衡器 亚马逊云 后面维护着 2 台 Linux 机器 使用 Jetty 9 0 3 有时我的 Jetty 容器会被 Thread 2 无故关闭 同时地 显示以下日志并且容器无故停止 没有错误 没有例
  • JS 中的 .Jar 文件

    有谁知道如何在 JS 中访问 jar 文件 我已经用 Java 创建了类并作为 jar 文件导入 我想从 JS 文件访问该类 大家好 我感谢你们所有人 我尝试在 Firefox XUL 中使用 JS 列出文件夹中的文件 但我做不到 然后我决
  • 我仍然认为在客户端哈希密码更好。我错了吗?

    我读过这些 https hackernoon com im harvesting credit card numbers and passwords from your site here s how 9a8cb347c5b5 https
  • 如何找到 JAR:/home/hadoop/contrib/streaming/hadoop-streaming.jar

    我正在练习有关 Amazon EMR 的复数视角视频教程 我被困住了 因为我收到此错误而无法继续 Not a valid JAR home hadoop contrib streaming hadoop streaming jar 请注意
  • 如果垃圾收集器没有删除未引用的对象,它们还能运行吗?

    如果一个对象正在等待垃圾收集 但包含一个在该对象的最后一个引用更改时正在运行的线程 那么该线程是否仍会运行并且代码是否仍会执行 那么您是否可能有一堆应该删除的幽灵对象 但它们对您的代码产生了影响 你如何防止这种情况发生 有没有办法让对象知道
  • E/libEGL: validate_display:99 错误 3008 (EGL_BAD_DISPLAY) API 24 或更高版本

    当我使用 API 为 24 或更高版本的设备时 我收到此错误 E libEGL validate display 99 错误 3008 EGL BAD DISPLAY XML 代码 activity main xml

随机推荐

  • 根据 R 中的条件选择列表的嵌套子列表

    我有以下嵌套列表的简单示例 list list structure list group a def control Names c group def list structure list group b def disease1 Na
  • 如何解决“LINQ to Entities 中的排序输入仅支持方法‘Skip’”。

    当我使用 LINQ toEntity 显示每个产品并在 ASP NET MVC 中实现分页时 出现此错误 The method Skip is only supported for sorted input in LINQ to Entit
  • 文本色调的 CSS 等效项

    我正在尝试将文件从 Adob e InDesign 导出到基本 HTML CSS 用户可以选择一些文本并更改文本颜色 使用 InDesign SDK 我可以获取该颜色的 RGB 值 并在 CSS 文件中声明color rgb R G B 效
  • Visual Studio 2012 Web Essential 中缺少 Typescript 选项

    我正在设置 Visual Studio 2012 和 TypeScript 我遇到的问题是 网络要点Visual Studio 2012 gt 工具 gt 选项 gt Web Essentials gt TypeScript所有选项均丢失
  • 当字符串以 &*( 开头并以 )(* 结尾时,如何从字符串中删除一部分文本

    我有一根很长的绳子 字符串中的某个位置有一部分以 然后有一些文字 以 如何删除此文本以及开头和结尾的特殊符号 Example Bla bla bla asd asd asd bla bla bla Yadda yadda yadda akl
  • 将 CCAvenue 与 php 集成

    我是支付网关的新手 我想使用 PHP 将 CCAvenue 集成到我的网站 我已经下载了他们的集成工具包 包括我的商家 ID 和工作密钥 将帐户设置为活动状态 并尝试对他们在我的本地主机中提供的索引文件进行虚拟交易 但是 当我点击表单上的
  • 在新选项卡中打开 FPDF

    我有一个从帖子表单生成的 pdf fpdf 我希望 pdf 在新选项卡和 或窗口中打开 提示用户保存 pdf 我猜我需要将输出保存到字符串中 data pdf gt Output OfficeForm pdf S 但我到底可以用这个字符串做
  • JGit S3 仅支持标准美国存储桶?

    除了美国标准的 S3 存储桶之外 是否可以使用 JGit 的其他位置 即通过配置文件等 还是我在这里做错了什么 如果我尝试将位于 EU 的 S3 存储桶与 JGit 一起使用 jgit 会抛出错误 gt jgit push origin m
  • 在 API 23 / Marshmallow 中的 onOptionsItemSelected() 内的 recreate() 上出现错误

    我正在尝试使我的应用程序在 APIoptions menu 如果他们慢慢地点击菜单选项 这样就有时间看到该选项被突出显示 一切都很好 但如果他们短暂地点击 应用程序就会崩溃 我知道这是一种非常奇怪的行为 我花了一些时间试图理解是什么引发了错
  • cx_Freeze 复制路径

    我正在使用 cx Freeze 为我的 PyQt 应用程序生成 Windows 二进制文件 但生成的二进制安装程序似乎仍然包含对我的计算机上的文件的引用 生成二进制文件的那个 所以我无法将生成的安装程序分发到其他机器 当该程序在另一台计算机
  • tvOS 模拟器是否支持使用 Apple 登录 (SIWA)?

    我已在项目目标中启用 SIWA 的权利 相同的步骤在 iOS 模拟器中运行良好 我在 tvOS 模拟器上尝试使用 Apple SIWA 登录时遇到以下问题 重现问题的步骤 在点击自定义按钮请求 SIWA 时 全屏显示 Apple id 密码
  • 从用户位置查找数组中最接近的经度和纬度 - iOS Swift

    在发布的问题中here https stackoverflow com questions 24783442 find closest longitude and latitude in array from user location a
  • 如何复制 - 粘贴由 QStandardItemModel 创建的 QTableView 中的多个项目到文本/excel 文件?

    如何将 QTableView 的多个项目 值复制并粘贴到文本 Excel 文件 My Code tab table view QtGui QWidget self Tab insertTab 0 tab table view self Fi
  • React hooks - useState() 不会使用新状态更新重新渲染 UI

    我正在尝试新的 React Hooks 但我有点卡住了 因为更新本地状态时 UI 没有更新 这是我的代码 import React useState useEffect from react import Post from Post im
  • runas 不允许复杂的参数?

    我有一个应用程序 我试图在 Windows 7 和 Windows XP 瘦客户端上运行提升 但我似乎无法正确获取 runas exe 命令行 我知道我需要其中的反斜杠转义字符 以便 runas 正确解释空格 当将 run 作为已用反斜杠转
  • 如何将原始数据传递给asp.net core中间件

    我需要将一些数据传递到 ASP NET CORE 中间件 例如如果这是一个字符串列表 您是否使用与传递服务相同的机制 例如将其作为参数添加到 Invoke 方法中并向 DI 注册 如果是这样 您如何进行原始类型的注册 例如字符串列表 它必须
  • 在 R 中轻松输入相关矩阵

    我现在正在运行一个 R 脚本 当前使用 3 个相关变量 我想添加第四个 并且想知道是否有一种简单的方法来输入矩阵数据 特别是对于相关矩阵 一些类似Matlab的技术在R中输入相关矩阵 3x3或4x4 而不需要线性我一直在使用矩阵重塑 在 M
  • 如何让 prettier 打破所有联合类型?

    我要这个 type SomeType Variant1 Variant2 始终格式化为 type SomeType Variant1 Variant2 不管是否溢出指定的列宽 如果您需要对格式进行一定程度的控制 那么您可能不是 Pretti
  • matplotlib 中的直方图,x 轴上的时间

    我是 matplotlib 1 3 1 2 的新手 我找不到合适的起点 我想用 matplotlib 在直方图中绘制点随时间的分布 基本上我想绘制日期出现的累积总和 date 2011 12 13 2011 12 13 2013 11 01
  • 在 Java 中创建哈希的标准方法

    问题是关于在 Java 中创建哈希的正确方法 假设我有一个积极的BigInteger我想从中创建哈希的值 让我们假设下面的实例messageDigest是一个有效的实例 SHA 256 public static final BigInte