【问题标题】:Use window.crypto in nodejs code在 nodejs 代码中使用 window.crypto
【发布时间】:2014-11-01 18:02:27
【问题描述】:

我正在尝试在 nodejs 脚本中使用 window.crypto.getRandomValues 方法。据我了解,当我在节点中运行这样的简单代码时,没有window 元素:

var array = new Uint32Array(10);
window.crypto.getRandomValues(array);

这就是我收到此错误的原因:

ReferenceError: window is not defined

如何在我的代码中使用这种方法?

谢谢

【问题讨论】:

  • crypto.subtle.generateKey(...) 怎么样?

标签: javascript node.js cryptography


【解决方案1】:
const crypto = require('crypto').webcrypto;

let a = new Uint8Array(24);
console.log(crypto.getRandomValues(a));

这与浏览器中的操作几乎完全相同,只需将webcrypto 添加到requrie('crypto'); 的末尾。

【讨论】:

  • 应该注意 crypto.webcrypto 仅在 Node.js 15.0.0+ 中可用。 LTS 版本尚不支持它。
  • Node 16 现在是 LTS,这是一个很好的答案!
【解决方案2】:

你可以使用这个和window元素一样的模块:get-random-values

安装它:

npm install get-random-values --save

使用它:

var getRandomValues = require('get-random-values');

var array = new Uint32Array(10);
getRandomValues(array);

【讨论】:

  • 这个和window元素不一样,这个使用nodejs crypto
  • TypeError: 预期的 Uint8Array
  • 这应该是正确的答案,简单的加一下,就可以和浏览器版本一样了。
【解决方案3】:

您可以改用内置的crypto 模块。它同时提供crypto.randomBytes()crypto.pseudoRandomBytes()

但是需要注意的是,这些方法给你一个Buffer对象,你不能传入一个Uint32Array或类似的,所以API有点不同。

【讨论】:

  • 好的,谢谢。如何将缓冲区对象返回为简单的 256 位数字?
  • 您必须使用一些 javascript 大数字/整数库将字节转换为大数字。
  • 请注意,从 Node 7.10.0 版本开始,NodeJS 中有一个 crypto.randomFillSync() 函数,它允许您传递 TypedArray
猜你喜欢
  • 2019-11-29
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
  • 2016-06-24
相关资源
最近更新 更多