Node.js 如何将SHA-256值设置为加密哈希?

Node.js 如何将SHA-256值设置为加密哈希?,node.js,cryptography,Node.js,Cryptography,我正在使用Node.JS和模块。我有一个十六进制字符串的SHA-256哈希,我想用它创建一个实例。我只找到了散列输入字符串本身的方法,但没有找到更新或新散列的方法。我在文档中遗漏了什么吗 我正在寻找类似(UUID)的东西: 下面的小示例代码将字符串散列为base64和十六进制字符串编码 这是输出: buf: The quick brown fox jumps over the lazy dog sha256 (Base64): 16j7swfXgJRpypq8sAguT41WUeRtPNt2LQ

我正在使用Node.JS和模块。我有一个十六进制字符串的SHA-256哈希,我想用它创建一个实例。我只找到了散列输入字符串本身的方法,但没有找到更新或新散列的方法。我在文档中遗漏了什么吗

我正在寻找类似(UUID)的东西:


下面的小示例代码将字符串散列为base64和十六进制字符串编码

这是输出:

buf: The quick brown fox jumps over the lazy dog
sha256 (Base64): 16j7swfXgJRpypq8sAguT41WUeRtPNt2LQLQvzfJ5ZI=
sha256 (hex): d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592
代码:

编辑:我误解了这个问题,任务是运行几个SHA-256更新调用(例如针对不同的字符串)并接收(中间)结果。稍后,该结果应被用作“输入”,散列应通过更多的更新调用进行,并以“final”/“digest”结束,以获得关于所有部分的最终sha-256值


不幸的是,似乎没有办法,因为中间值是最终值,而且(再次)似乎没有办法返回,因为最终/摘要调用进行了如此多的计算(与底层Merkle-Damgård构造有关)。唯一的方法是使用自己编写的SHA-256函数并保存所有内部寄存器的状态,继续时重置寄存器,最后获得最终值


建议获取sha-256实现的源代码并保存所有使用变量的内部状态。继续时,需要还原这些变量并运行下一个更新调用。我看过一些(Java)IMP,对我来说并不难。

一般来说,没有多少库可以满足您的要求。当然,有一些库可以检索和恢复内部状态,比如BouncyCastle,但到目前为止,我还没有在任何JavaScript库中看到它。这将是非常容易创建,虽然

实际上,在对最后一个块进行哈希运算后,每个512位块之后的256位(总)中间值将用作最终输出。因此,如果您可以“恢复”这些值(即将它们置于状态),那么您可以在恢复之后继续进行散列

不过,这可能没有那么有用,因为这些值已经包含在块末尾编码为64位表示的填充和消息大小。因此,如果在此之后继续散列,则可能会再次包含该填充和长度,但现在使用不同的值


智能卡中有时使用的一个技巧是在最后一个要散列的数据之前上载中间值(包括散列的位数),并让智能卡执行填充、长度编码和最终散列块操作。这通常在对大量数据进行签名计算时执行(因为您确实不想将整个文档发送到智能卡)


如果你问我的话,那就相当愚蠢了,使用预先计算好的哈希值直接签名就是前进的方向。或者确保对大量数据进行预散列,然后对散列进行签名(包括另一次散列),这样就可以避免整个问题,而无需特别技巧。

谢谢!但这只是展示了如何散列字符串。在我的例子中,我有一个sha作为输入字符串好的,你有一个十六进制字符串格式的散列,你想用这个值吗?我不理解您的“创建加密.Hash实例”填充/还原加密.Hash对象,以便我可以继续调用
update(…)
函数感谢更新,现在我理解了。例如,您正在散列3个字符串,获取一个中间值(sha-256),存储该值并尝试继续使用该值对其他2个字符串进行更新调用->以获取5个字符串的最终值。不幸的是,似乎没有办法,因为中间值是最终值,因此(再次)似乎无法返回,因为final/digest调用进行了如此多的计算(与基础[Merkle Damgård构造]()。唯一的方法是使用自己编写的SHA-256函数并保存所有内部寄存器的状态,继续时重置寄存器并最终获得最终值。祝您好运!
buf: The quick brown fox jumps over the lazy dog
sha256 (Base64): 16j7swfXgJRpypq8sAguT41WUeRtPNt2LQLQvzfJ5ZI=
sha256 (hex): d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592
var crypto = require('crypto');
const plaintext = 'The quick brown fox jumps over the lazy dog';
const buf = Buffer.from(plaintext, 'utf8');
console.log('buf: ' + buf);
const sha256Base64 = crypto.createHash('sha256').update(buf).digest('base64');
console.log('sha256 (Base64): ' + sha256Base64);
const sha256Hex = crypto.createHash('sha256').update(buf).digest('hex');
console.log('sha256 (hex): ' + sha256Hex);