首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Electronjs和Nodejs(Crypto) crypto.scryptSync不是函数

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

Stack Overflow用户
提问于 2019-02-18 06:19:35
回答 2查看 3.3K关注 0票数 2

嗨,所以我有一个服务器运行加密它完美的工作。Im使用electronjs作为客户端,并且加密应该被构建到节点中。当我尝试使用该模块时,它返回"crypto.scryptSync不是一个函数“

我有过

代码语言:javascript
复制
 let crypto = require('crypto');

在页面的顶部

我正在做一个简单的调用,如下所示

Encrypt_AES

代码语言:javascript
复制
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

代码语言:javascript
复制
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 -i加密

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-20 18:53:05

问题所在

当Electron支持的Node版本比本地Node安装的版本旧时,可能会发生这样的情况:使用Electron时没有定义Node函数,或者即使它与您的本地Node安装配合良好,也不接受特定的参数。

找出您使用的版本

一个不错的开始是查看有问题的函数何时被添加到Node。您可以通过查看Node.js documentation来做到这一点。在下拉框中,您将在函数名称的正下方找到一个History表。

在这里我们可以看到,scryptSync是在节点10.5.0中添加的。

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

console.log(process.versions)

您应该可以在输出中找到已使用的Node版本。例如,对于Electron 3.1.4,它应该是这样的:

代码语言:javascript
复制
{ 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安装的输出:

代码语言:javascript
复制
{ 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' }

如我们所见,Electron3使用Node10.2.0。因此,在电子使用的节点中,scryptSync尚未实现,因此是undefined

如何解决这个问题?

如果已经发布了支持您需要的Node版本的较新的Electron版本,则可以解决此问题。

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

在这种情况下,我们很幸运:Electron4支持Node10.11.0,它实现了scryptSync

所以升级到最新的Electron版本应该可以解决这个问题。

票数 4
EN

Stack Overflow用户

发布于 2019-02-18 06:29:23

我认为要让nodejs模块在电子中工作,你需要设置的不仅仅是requiring in,就像你在node中使用的库一样。

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

Using Native Node Modules

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54738225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档