在 NodeJS 中重用加密模块创建的哈希对象是否安全?

Is it safe to reuse the hash object created by the crypto module in NodeJS?

要使用 nodejs 散列有效载荷,我可以使用加密模块并执行以下操作:

const crypto = require('crypto');
const payload = "abc123";
const hashObj = crypto.createHash('sha256');
const res = hashObj.update(payload).digest('hex');

现在假设我想散列第二个有效负载,我可以安全地重用我刚刚实例化的 hashObj 并使用新的有效负载对其调用 updatedigest 吗?还是我必须为每个有效负载调用 createHash

编辑:澄清一下,重用是指将上面的代码扩展为以下代码:

const crypto = require('crypto');
const payload1 = "abc123";
const payload2 = "def456";
const hashObj = crypto.createHash('sha256');

const res1 = hashObj.update(payload1).digest('hex');
const res2 = hashObj.update(payload2).digest('hex');

哈希器不重置,向哈希器调用update() only adds more data。所以这个:

const res1 = hashObj.update(payload1).digest('hex');
const res2 = hashObj.update(payload2).digest('hex');

会将 payload1 的散列分配给 res1,将 payload1 + payload2 的摘要分配给 res2,除了 calling .digest() finalizes the hasher 的部分:

The Hash object can not be used again after hash.digest() method has been called. Multiple calls will cause an error to be thrown.

因此,对于任何离散的数据,您都需要一个单独的哈希器,对于任何数据流,您可以 update() 尽可能多地使用,然后在您拥有后调用 .digest()一切都收拾好了。