【问题标题】:Using crypto node.js Library, unable to create SHA-256 Hashes multiple times in rapid succession使用 crypto node.js 库,无法快速连续多次创建 SHA-256 哈希
【发布时间】:2017-12-04 22:46:46
【问题描述】:

我正在创建一个自动递增数字的哈希。我创建了两个示例循环,说明我是如何尝试实现这一点的。

当 #1 运行时,第一个哈希记录到控制台,在循环的第二次迭代中,返回以下错误。错误:摘要已调用

我相信这是由于文档中的此引用:在调用 hash.digest() 方法后,无法再次使用 Hash 对象。多次调用会引发错误。

如何创建一个循环,使用 Node 的加密库一次创建多个哈希?

 // Reproduce #1
 const crypto = require('crypto');

 const hash = crypto.createHash('sha256');

 for (let i = 0; i < 5; i++) {
   hash.update('secret' + i);

   console.log(hash.digest('hex'));
 }

【问题讨论】:

  • 您使用的是哪个节点版本?对于#1,我必须将 const hash = crypto.createHash('sha256'); 移动到您的 for 循环中(实例不可重用)。对于#2,你有一个错字sha1256sha256
  • 我有 Node v8.1.2。感谢您的错字提醒。第一个不起作用,因为它违反了文档中的这一点:The Hash object can not be used again after hash.digest() method has been called. Multiple calls will cause an error to be thrown.
  • 我的目标是创建一种方法,该方法基于“API 机密”对某些输入字段进行散列处理来创建序列号。如果我把这个逻辑或任何与之类似的东西放在一起,它就会失败。第一个是有效的序列,但后续的实际上并没有抛出错误。他们只是因为.digest()和/或.createHash()而制作了无效的连续剧

标签: javascript node.js hash cryptography sha256


【解决方案1】:

如果错误是“已调用摘要”,那么我们的想法是只调用一次哈希。您可以通过在每次迭代中创建一个新的 Hash 实例来做到这一点:

const crypto = require('crypto');
for (let i = 0; i < 5; i++) {
    const hash = crypto.createHash('sha256');
    hash.update('secret' + i);
    console.log(hash.digest('hex'));
}

输出:

97699b7cc0a0ed83b78b2002f0e57046ee561be6942bec256fe201abba552a9e 5b11618c2e44027877d0cd0921ed166b9f176f50587fc91e7534dd2946db77d6 35224d0d3465d74e855f8d69a136e79c744ea35a675d3393360a327cbf6359a2 e0d9ac7d3719d04d3d68bc463498b0889723c4e70c3549d43681dd8996b7177f fe2d033fef7942ed06d418992d35ca98feb53943d452f5994f96934d754e15cb

【讨论】:

  • 好像是一个库的bug,重复const H = crypto.createHash('sha256')...初始化H必须是可重用的...如何请求修复它?
  • 我并不完全相信。我目前的想法是hash.digest 将是确定性的,因此使用相同哈希的后续调用将输出相同的结果。因此,每次都需要创建一个新的哈希。另外,我的猜测是哈希对象内部有一个单例本地状态字段,该字段在 createHash 时设置,然后在摘要时重置,因此如果您连续调用 createHash 两次,它将检测到陈旧条件。
  • @agm1984 这可能是发生错误的原因。此外,我没有试图在我的回答中确定行为为何如此。我只提供了解决问题的方法。
【解决方案2】:

无需在每个实例上重复 const H = crypto.createHash('sha256') 的干净方法是使用 hash.copy() -

 const crypto = require('crypto');
 const hash = crypto.createHash('sha256');

 for (let i = 0; i < 5; i++) {
   hash.update('secret' + i);
   console.log(hash.copy().digest('hex'));
 }

你得到想要的输出 -

e7ebc4daa65343449285b5736ebe98a575c50ce337e86055683452d7d612ac78
3dc562fa371a320efb0cca0ae344c8a5bddfcd3d5191cd124798404b729423c2
7547b5c1992ed566a2125817b2c76ed4a7d3c551232904f886bd954e649e3144
b49247304dc3ef76d9ebfd0482bfc68ab9b7b0fe2007b7c60e03ad6b8123be33
82bc2bcfc528fd55807a981c79e0b6aa430a690b51de79d9d0c5f5627864965b

【讨论】:

  • 我收到了TypeError: hash.copy is not a function 提出的解决方案。
  • 根据hash.copy([options])的文档,它创建了一个新的Hash对象,其中包含当前Hash对象内部状态的深拷贝。这不是什么OP 想要,因为复制内部状态意味着在第二次迭代期间,第一次迭代的数据也被考虑在内以产生第二次哈希。
猜你喜欢
  • 2014-08-19
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 2011-11-20
  • 2023-03-18
  • 2015-09-22
  • 2014-03-12
  • 2013-01-09
相关资源
最近更新 更多