Electronjs和Nodejs(Crypto)crypto.scryptSync不是函数

时间:2019-02-17 22:19:35

标签: node.js cryptography electron

嗨,我有一台运行Crypto的服务器,它工作正常。我使用electronjs作为客户端,并假定将加密内置到节点中。当我尝试使用该模块时,它返回“ crypto.scryptSync不是函数”

我有

 let crypto = require('crypto');

在页面顶部

我只是做一个简单的电话

Encrypt_AES

function Encrypt_AES(data, pubkey) {
 const algorithm = 'aes-192-cbc';
 const key = crypto.scryptSync(pubkey, 'salt', 24);
 const iv = Buffer.alloc(16, 0); // Initialization vector.
 const cipher = crypto.createCipheriv(algorithm, key, iv);
 let encrypted = cipher.update(JSON.stringify(data), 'utf8', 'hex');
 encrypted += cipher.final('hex');
 return encrypted;
}

Decrypt_AES

function Decrypt_AES(data, pubkey) {
 const algorithm = 'aes-192-cbc';
 const key = crypto.scryptSync(pubkey, 'salt', 24);
 const iv = Buffer.alloc(16, 0); // Initialization vector.
 const decipher = crypto.createDecipheriv(algorithm, key, iv);
 let decrypted = decipher.update(data, 'hex', 'utf8');
 decrypted += decipher.final('utf8');
 return JSON.parse(decrypted);
}

我不明白它是如何无法吸收电子中的模块的,我从未遇到过任何其他模块的问题。

我尝试了一次npm-我加密了

npm WARN deprecated crypto@1.0.1: This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in. npm notice created a lockfile as package-lock.json. You should commit this file. + crypto@1.0.1 added 1 package and audited 724 packages in 4.95s found 0 vulnerabilities

2 个答案:

答案 0 :(得分:2)

问题

当Electron支持的Node版本早于本地Node安装时,在使用Electron时未定义Node函数或不使用特定参数,即使它在本地Node安装中工作正常也可能发生。

找出您使用的版本

一个好的开始是查看有问题的函数何时添加到Node。您可以通过查看Node.js documentation来做到这一点。您会在下拉菜单块的功能名称下方找到一个“历史记录”表。

Node.js History Table

在这里我们看到在节点10.5.0中添加了scryptSync

如果您不知道Electron安装支持的Node版本,可以使用Electron运行以下命令:

console.log(process.versions)

您应该在输出中找到使用的Node版本。例如对于Electron 3.1.4,它应如下所示:

{ http_parser: '2.8.0',
  node: '10.2.0',
  v8: '6.6.346.32',
  uv: '1.20.3',
  zlib: '1.2.11',
  ares: '1.14.0',
  modules: '64',
  nghttp2: '1.29.0',
  napi: '3',
  openssl: '1.1.0h',
  electron: '3.1.4',
  chrome: '66.0.3359.181' }

为了进行比较,这是我的Electron 4.0.2安装的输出:

{ http_parser: '2.8.0',
  node: '10.11.0',
  v8: '6.9.427.24-electron.0',
  uv: '1.23.0',
  zlib: '1.2.11',
  ares: '1.14.0',
  modules: '64',
  nghttp2: '1.33.0',
  napi: '3',
  openssl: '1.1.0',
  electron: '4.0.2',
  chrome: '69.0.3497.106',
  icu: '62.1',
  unicode: '11.0',
  cldr: '33.1',
  tz: '2018e' }

我们看到电子3使用节点10.2.0。因此,尚未实现Electron使用scryptSync的节点,因此undefined

如何解决这个问题

如果已经发布了支持所需节点版本的较新电子版本,则可以解决此问题。

您可以在Electron release notes中查找它。到目前为止,Node版本的升级是在主要版本中实现的,因此查看下一个x.0.0版本是一个好的开始。

在这种情况下,我们很幸运:电子4支持实现scryptSync的节点10.11.0。

Electron release notes for Electron 4.0.0

因此,升级到最新的Electron版本应该可以解决此问题。

答案 1 :(得分:0)

我认为,要使nodejs模块在电子环境中工作,您不仅需要设置更多的功能,例如您正在使用node中的库。

该链接似乎为您提供了在电子中使用NPM / nodejs模块所需的信息:

Using Native Node Modules