【问题标题】:nodejs: how to get intermediate hash valuesnodejs:如何获取中间哈希值
【发布时间】:2019-01-18 08:51:15
【问题描述】:

我想使用 sha256 哈希值来保护顺序文件的内容。 由于文件必须在运行时进行扩展,因此每次追加/扩展时都需要进行哈希计算。 我想要的是一个永久哈希对象,仅使用附加数据进行更新并允许检索中间结果。

由于应该在nodejs中完成,javascript代码可能如下所示:

const fs = require('fs'), crypto = require('crypto')
var hashPerp = crypto.createHash('sha256')

var data = 'record 1'
fs.writeFileSync('mylist.dat', data)
hashPerp.update(data)
var hashInter = CLONE(hashPerp)
console.log(hashInter.digest('base64'))

data = 'record 2'
fs.appendFileSync('mylist.dat', data)
hashPerp.update(data)
hashInter = CLONE(hashPerp)
console.log(hashInter.digest('base64'))

...

我没有找到合适的对象 CLONE() 函数,并且克隆哈希对象及其内部缓冲区也可能不是解决问题的唯一方法。

有什么建议吗?

【问题讨论】:

  • 那么,在追加之后,您希望散列 'record1record2' 这将是文件的内容,还是只是 'record2' ?
  • 我不认为你可以像这样与散列函数交互,告诉它:look, I already have this piece calculated for you, so you don't have to! Please take it!。这不是安全工作的方式。此外,文件中包含一个额外的字符会导致完全不同的哈希值,因此预先计算的哈希值是无用的。
  • @Dhananjai Pai:因此我需要整个文件的哈希值,即'record 1record 2'
  • @AdrianPop:如果您查看 sha256 源代码,实际上会使用 64 字节(八位字节)的输入数据块更新 8 个长整数字段的数组。 digest() 或 finalize() 然后得出最终的 32 字节结果。不好的是,digest() 会破坏工作缓冲区,您无法继续更新。所以我认为,它可以通过自己的 sha256 实现来完成。但我想避免在慢速 javascript 中执行此操作,并且还需要对算法有更深入的了解。
  • 是的,您可以采用 SHA-256 实现并将其拆开。当然,您只能在填充等之后计算哈希结果。因此,您需要在计算填充和长度的最后一个块之前缓存块的结果,以及在最后一个或倒数第二个块中散列的任何数据.不过,我还没有看到任何预制的解决方案,所以你可能必须自己做。

标签: javascript node.js cryptography sha256


【解决方案1】:

我想得太复杂了:在我的情况下(表达文件的内容)“SHA” - 安全散列算法 - 实际上不是必需的,一个简单的散列函数就可以完成这项工作。因此,将使用 CRC32,它允许连续添加字节。

【讨论】:

    猜你喜欢
    • 2013-01-09
    • 2010-12-19
    • 1970-01-01
    • 2021-12-30
    • 2015-10-17
    • 2012-07-01
    • 1970-01-01
    • 2016-07-22
    • 2023-03-24
    相关资源
    最近更新 更多