在nodejs代码中使用window.crypto

Use window.crypto in nodejs code

本文关键字:window crypto nodejs 代码      更新时间:2023-09-26

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

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

这就是为什么我得到这个错误:

ReferenceError: window is not defined

如何在代码中使用此方法?

感谢

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

但是需要注意的是,这些方法为您提供了一个Buffer对象,您不能传入Uint32Array或类似的对象,因此API有点不同。

const crypto = require('crypto').webcrypto;
let a = new Uint8Array(24);
console.log(crypto.getRandomValues(a));

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

您可以使用与窗口元素相同的模块:获取随机值

安装:

npm install get-random-values --save

使用它:

var getRandomValues = require('get-random-values');
var array = new Uint32Array(10);
getRandomValues(array);

以下是如何在节点16中使用TypeScript。我正在劫持web类型并覆盖@types/node类型,这些类型缺少webcrypto。

import { webcrypto } from 'crypto'
const crypto = webcrypto as unknown as Crypto
const random = crypto.getRandomValues(new Uint8Array(24))

这个沙箱将在节点16中工作,但stackblitz在接下来的几个月内不会发布节点16。https://stackblitz.com/edit/koa-starter-wychx9?file=package.json

问题:github.com/denoland/node_deno_shims/issues/56

我也遇到了这个问题,我用的方式解决了它

import * as crypto from 'node:crypto'
export function randomChar() {
  return crypto.webcrypto.getRandomValues(new BigUint64Array(1))[0].toString(36)
}

参考:如何在nodejs中使用getRandomValues()?

在Node.js 19中,您可以直接使用它(不使用window.

const array = new Uint32Array(10);
crypto.getRandomValues(array);