TypeScript文件中的Node.js加密

Unn*_*son 7 javascript node.js typescript angular

我创建了我自己的需要加密的hash.js文件,并导出了两个使用加密的函数。当我对密码进行哈希处理时,它在我的api.js文件中工作正常。但是,现在我试图将此文件导入到user.service.ts文件中,以便可以将密码的哈希版本作为查询参数而不是密码本身发送。当我尝试这样做时,我总是收到TypeScript错误,告诉我crypto使用的函数不是函数。但是,我仍然可以控制台日志记录导入的对象,对我来说它看起来合法。我查看了node_modules文件夹中的其他Java脚本文件,但看不到任何文件错误。

我还发现似乎需要创建一些定义文件,但是我也曾尝试过创建这样的文件,但似乎无济于事

几个小时的谷歌搜索以及对该项目的时间不足导致的知识不足,这使我成为了这篇文章,这是我的第一个stackoverflow帖子,我希望它不会不清楚,我很高兴提供任何需要的信息来帮助我解决此问题。

来自控制台的错误代码

LoginComponent.html:18 ERROR TypeError: crypto.randomBytes is not a function
at Object.genRandomString (hash.js:12)
at UserService.loginUser (user.service.ts:82)
at LoginComponent.getUser (login.component.ts:54)
at LoginComponent.onSubmit (login.component.ts:44)
at Object.eval [as handleEvent] (LoginComponent.html:18)
at handleEvent (core.es5.js:12014)
at callWithDebugContext (core.es5.js:13475)
at Object.debugHandleEvent [as handleEvent] (core.es5.js:13063)
at dispatchEvent (core.es5.js:8607)
at core.es5.js:10775

LoginComponent.html:18 ERROR CONTEXT DebugContext_ {view: {…}, nodeIndex: 31, nodeDef: {…}, elDef: {…}, elView: {…}}
Run Code Online (Sandbox Code Playgroud)

hash.js文件

'use strict'; var crypto = require('crypto'); /** * generates random string of characters i.e salt * @function * @param {number} length - Length of the random string. */ function genRandomString (length){ return crypto.randomBytes(Math.ceil(length/2)) .toString('hex') /** convert to hexadecimal format */ .slice(0,length); /** return required number of characters */ }; /** * hash password with sha512. * @function * @param {string} password - List of required fields. * @param {string} salt - Data to be validated. */ function sha512(password, salt){ var hash = crypto.createHmac('sha512', salt); /** Hashing algorithm sha512 */ hash.update(password); var value = hash.digest('hex'); return { salt:salt, passwordHash:value }; }; module.exports = { genRandomString: genRandomString, sha512: sha512 };

Run Code Online (Sandbox Code Playgroud)

Dra*_*sil 7

似乎混用了JavaScript和TypeScript,但由于我自己遇到了这个问题,因此这是我解决的方法。

首先,您的hash.js文件应为hash.ts。然后,您可以导入加密货币并正常使用它。相关代码如下:

import * as crypto from "crypto";

  public setEncryptionKeyDES(sKey: string) {
    const desIV = Buffer.alloc(8);
    this.encLobby.cipher = crypto.createCipheriv(
      "des-cbc",
      Buffer.from(sKey, "hex"),
      desIV,
    );
    this.encLobby.cipher.setAutoPadding(false);
    this.encLobby.decipher = crypto.createDecipheriv(
      "des-cbc",
      Buffer.from(sKey, "hex"),
      desIV,
    );
    this.encLobby.decipher.setAutoPadding(false);

    this.isSetupComplete = true;
  }
Run Code Online (Sandbox Code Playgroud)


att*_*ona 6

刚刚遇到这个问题(节点 v13.12.0,tsc v3.8.3)。在我的情况下,导入:

import * as crypto from "crypto";
Run Code Online (Sandbox Code Playgroud)

给出错误:

error TS2307: Cannot find module 'crypto'
Run Code Online (Sandbox Code Playgroud)

因为我必须为节点安装类型定义:它包括加密环境声明。

npm install @types/node
Run Code Online (Sandbox Code Playgroud)

注意:如果您有一个全局安装,@types/node那么您必须@types 使用--typesRoot选项显式声明位于何处的路径。有关详细信息,请参见此处


Laz*_*vić 1

当我尝试这样做时,我总是收到 TypeScript 错误,告诉我 crypto 使用的函数不是函数。

发生这种情况是因为 TypeScript 静态分析您的文件并尝试帮助您处理正在使用的数据类型。如果您使用的是用 JavaScript 编写的函数,而没有向 TypeScript 提供任何有关该函数用作参数的内容以及其返回值的类型的提示,则它根本无法完成其工作,这就是您收到错误的原因。

您可以创建一个声明文件,但如果您想要快速修复并且不会在其他文件中使用这些原始 JS 函数,则不需要创建。您只需在文件中的任何位置声明它即可。您可以阅读有关declare在 TypeScript 中使用关键字的更多信息。

不过,我仍然可以通过控制台记录我导入的对象,并且它对我来说看起来是合法的。

从您的屏幕截图来看,该函数randomBytes被正确调用(正如您从错误下方打印的堆栈跟踪中看到的那样)。问题是该crypto对象不包含名为 的方法randomBytes。这是因为crypto在较新的浏览器中 是一个全局对象。

<code>crypto</code> 对象存在于浏览器中

您的crypto.js文件可能假设存在crypto与浏览器不同的全局对象。要么在适当的范围内提供此对象,以便您的函数可以看到它,要么使用打包器(例如 Rollup)内联这些函数。