【发布时间】: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