无法在Electron应用程序的NPM依赖项中使用加密

时间:2019-12-02 15:27:36

标签: node.js electron

我正在构建一个电子应用程序(带有Ionic),以使用node-signpdf(https://www.npmjs.com/package/node-signpdf)用p12证书对PDF进行数字签名。我遇到了一些问题,例如使用require ('electron').remote来解决fs

我还在OS(MacOS Catalina)中安装了与电子正在使用的节点版本相同的节点版本(Node v12.4.0)。

问题是NPM依赖项之一使用了加密,并且显示为undefined并出现下一个错误:

HomePage.html:39 ERROR TypeError: _crypto.randomBytes is not a function
    at Object.ctx.seedFileSync (prng.js:340)
    at _reseedSync (prng.js:210)
    at Object.ctx.generateSync (prng.js:163)
    at Object.ctx.generate (prng.js:80)
    at Object.ctx.getBytes (random.js:92)
    at _modPow (rsa.js:431)
    at Object.push../node_modules/node-forge/lib/rsa.js.pki.rsa.encrypt (rsa.js:501)
    at Object.key.sign (rsa.js:1245)
    at addSignerInfos (pkcs7.js:534)
    at Object.sign (pkcs7.js:377)

我看到的是node-signpdf使用node-forge作为依赖项,并且node-forge以此方式在prng.js内加载加密货币:

var _crypto = null;
if(forge.util.isNodejs && !forge.options.usePureJavaScript &&
  !process.versions['node-webkit']) {
  _crypto = require('crypto');
}

我尝试将代码的那部分更改为使用crypto-js或browserfy-crypto(这最后一个甚至没有构建,并且多年未更新),但是我仍然收到上面显示的错误。

编辑1 : 这就是我在服务中实现签名的方式:

public signFile(pathToFile: string, pathToCert: string): void {
const fs = (<any>window).require('fs');

let certBuffer = fs.readFileSync(pathToCert);
let fileBuffer = fs.readFileSync(pathToFile);

fileBuffer = plainAddPlaceholder({
  pdfBuffer: fileBuffer,
  reason: 'I have reviewed it.',
  signatureLength: 1612,
});
const signedPdf = signer.sign(fileBuffer, certBuffer, {passphrase: 'qwertyui'});
}

代码添加占位符以添加签名,问题出在signer.sign

编辑2

如果我在控制台中键入以下内容来运行应用程序:require ('crypto'),我看到了这些方法,因此看起来好像是在全局范围中加载的,问题似乎出在node-forge的NPM依赖项上

编辑3

我已将require('crypto')更改为window.require('crypto')并开始工作。但是我认为我必须制作后安装脚本才能对其进行修改。

有更好的方法吗?

-

如何使此加密货币工作正常?我没主意了。也许您可以保留一些?

感谢您的时间!

0 个答案:

没有答案