在 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 中创建哈希的标准方法 的相关文章

  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 根据插入顺序迭代哈希?

    不想对条目进行排序 使用它也不会保留顺序 foreach my val keys hash 默认情况下 Perl 5 中的哈希值是无序的 您可以使用tie http perldoc perl org functions tie html a
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • 如何修复 JNLP 应用程序中的“缺少代码库、权限和应用程序名称清单属性”?

    随着最近的 Java 更新 许多人都遇到了缺少 Java Web Start 应用程序的问题Codebase Permissions and Application name体现属性 尽管有资源可以帮助您完成此任务 但我找不到任何资源综合的
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 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