如何将 SHA-256 值设置为 crypto.Hash?
How to set a SHA-256 value to crypto.Hash?
我正在使用 Node.JS 和 crypto module. I have a SHA-256 hash in hex string and would like to create a crypto.Hash instance out of it. I only found ways to hash the input string itself, but not to update or create 新哈希。我是否遗漏了文档中的某些内容?
我正在寻找类似的东西(虽然对于 UUID):
crypto.Hash.from("sha256", "hex", "d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592")
以下小示例代码将字符串散列为 base64 和十六进制字符串编码。
这是输出:
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);
编辑: 我误解了问题,任务是 运行 几个 SHA-256 更新调用(例如针对不同的字符串)并接收(中间)结果.稍后这个结果应该用作“输入”,散列应该进行更多的更新调用,以“最终”/“摘要”结束以获得所有部分的最终 sha-256 值。
不幸的是,似乎没有办法,因为中间值是最终值,而且(再次)似乎没有办法返回,因为 final/digest 调用进行了额外的计算(与底层有关Merkle-Damgård 结构)。唯一的方法是使用自己编写的 SHA-256 函数并保存所有内部寄存器的状态,在继续时重置寄存器并最终获得最终值。
一个建议可能是获取 sha-256 实现的源代码并保存所有使用变量的内部状态。继续时,您需要恢复这些变量和 运行 下一次更新调用。我看了一些(Java)个小鬼,对我来说看起来并不难。
一般来说,没有多少图书馆会按照您的要求去做。当然有可以检索和恢复内部状态的库,例如 Bouncy Castle,但到目前为止我还没有在任何 JavaScript 库中看到它。不过创建起来会很容易。
实际上,每个块后的 256 位(总)中间值 512 位 将用作最后一个块散列后的最终输出。因此,如果您可以“恢复”这些值(即将它们放入状态),那么您可以在那之后继续散列。
虽然这可能没有那么有用,因为这些值已经包含在块末尾编码为 64 位表示的填充和消息大小。因此,如果您在那之后继续散列,则填充和长度可能会再次包含在内,但现在具有不同的值。
有时在智能卡中使用的一个技巧是在要散列的最后一个数据之前上传中间值(包括散列的位数),并让智能卡执行padding,长度编码和最终的哈希块操作。这通常在对大量数据进行签名计算期间执行(因为您真的不想将整个文档发送到智能卡)。
如果你问我的话,这很愚蠢,直接使用预先计算的哈希值进行签名是前进的方向。或者确保对大量数据进行预散列,然后对散列进行签名(包括另一次散列)——这样就可以避免整个问题而无需特殊技巧。
我正在使用 Node.JS 和 crypto module. I have a SHA-256 hash in hex string and would like to create a crypto.Hash instance out of it. I only found ways to hash the input string itself, but not to update or create 新哈希。我是否遗漏了文档中的某些内容?
我正在寻找类似的东西(虽然对于 UUID):
crypto.Hash.from("sha256", "hex", "d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592")
以下小示例代码将字符串散列为 base64 和十六进制字符串编码。
这是输出:
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);
编辑: 我误解了问题,任务是 运行 几个 SHA-256 更新调用(例如针对不同的字符串)并接收(中间)结果.稍后这个结果应该用作“输入”,散列应该进行更多的更新调用,以“最终”/“摘要”结束以获得所有部分的最终 sha-256 值。
不幸的是,似乎没有办法,因为中间值是最终值,而且(再次)似乎没有办法返回,因为 final/digest 调用进行了额外的计算(与底层有关Merkle-Damgård 结构)。唯一的方法是使用自己编写的 SHA-256 函数并保存所有内部寄存器的状态,在继续时重置寄存器并最终获得最终值。
一个建议可能是获取 sha-256 实现的源代码并保存所有使用变量的内部状态。继续时,您需要恢复这些变量和 运行 下一次更新调用。我看了一些(Java)个小鬼,对我来说看起来并不难。
一般来说,没有多少图书馆会按照您的要求去做。当然有可以检索和恢复内部状态的库,例如 Bouncy Castle,但到目前为止我还没有在任何 JavaScript 库中看到它。不过创建起来会很容易。
实际上,每个块后的 256 位(总)中间值 512 位 将用作最后一个块散列后的最终输出。因此,如果您可以“恢复”这些值(即将它们放入状态),那么您可以在那之后继续散列。
虽然这可能没有那么有用,因为这些值已经包含在块末尾编码为 64 位表示的填充和消息大小。因此,如果您在那之后继续散列,则填充和长度可能会再次包含在内,但现在具有不同的值。
有时在智能卡中使用的一个技巧是在要散列的最后一个数据之前上传中间值(包括散列的位数),并让智能卡执行padding,长度编码和最终的哈希块操作。这通常在对大量数据进行签名计算期间执行(因为您真的不想将整个文档发送到智能卡)。
如果你问我的话,这很愚蠢,直接使用预先计算的哈希值进行签名是前进的方向。或者确保对大量数据进行预散列,然后对散列进行签名(包括另一次散列)——这样就可以避免整个问题而无需特殊技巧。