我正在尝试用Ionic 2实现crypto-js。
我做了以下事情:
npm install crypto-js typings install dt~crypto-js --global --save
我的index.d.ts
现在包含:
/// <reference path="globals/crypto-js/index.d.ts" />
在crypto-js
./typings/global
文件夹
然后我尝试以下代码:
declare var require: any;
import * as CryptoJS from 'crypto-js';
...
private CryptoJS: any;
constructor() {
this.CryptoJS = require("crypto-js");
}
test() {
alert(this.CryptoJS);
}
只要我尝试引用this.CryptoJS
(即alert(this.CryptoJS)
),应用就会崩溃。
我在导入crypto-js
库的方式上做错了。请问有人可以提出建议吗?
由于
更新
在this之后,我运行:
>npm install --save @types/cryptojs npm WARN package.json theWhoZoo@ No repository field. npm WARN package.json theWhoZoo@ No README data npm WARN package.json theWhoZoo@ No license field. @types/cryptojs@3.1.29 node_modules\@types\cryptojs
如何在代码中导入CryptoJS
?
由于
更新
import { Injectable } from "@angular/core";
import { LanguageModel } from './languageModel';
import { LocationModel } from './locationModel';
import { JobModel } from './jobModel';
import 'crypto-js';
@Injectable()
export class PersonModel {
public id: number = null;
public joiningDate: number = null;
public lastAccessDate: number = null;
public userName: string = null;
public password: string = null;
public firstName: string = null;
public lastName: string = null;
public emailAddress: string = null;
public locations: LocationModel[] = [];
public languages: LanguageModel[] = [];
public time: string = null;
public avatar: string = null;
public avatar64: string = null;
//private CryptoJS: any;
private SECERET_KEY: string = 'secret key 123';
public getPasswordEcrypted(): string {
// Decrypt
var bytes = CryptoJS.AES.decrypt(this.password.toString(), this.SECERET_KEY);
var plaintext = bytes.toString(CryptoJS.enc.Utf8);
console.log('getPasswordEcrypted', plaintext);
return plaintext;
}
public setPasswordEncrypted(password: string): void {
// Encrypt
alert(password);
console.log('setPasswordEncrypted', password, CryptoJS);
alert(CryptoJS);
var ciphertext = CryptoJS.AES.encrypt(password, this.SECERET_KEY);
alert(ciphertext);
console.log('setPasswordEncrypted', password, ciphertext);
this.password = ciphertext;
}
}
更新
更改为:
import CryptoJS from 'crypto-js';
结果:
更新
运行此:
typings install dt~crypto-js --global --save
不会导致构建错误,但在访问CryptoJS
时的运行时(例如console.log(CryptoJS);
),应用程序崩溃。
答案 0 :(得分:3)
Here就是解决方案。
安装npm库后
npm install crypto-js @types/cryptojs --save
在src下创建一个declaration.d.ts文件,并向模块添加声明。这可以解决您的模块未定义问题。
declare module 'crypto-js';
在服务类本身中,从模块中添加导入CrytoJS,如下所示:
import CryptoJS from 'crypto-js';
现在在您的代码中,您可以引用CryptoJS。例如:
let obj = CryptoJS.enc.Base64.stringify(CryptoJS.HmacSHA256(['abcd', this.config.salt].join(':'), this.config.salt));
console.log(obj);
输出:
t2eCyUuZMKRNTRqCW0L5KRvMjWhLV887h1ehjCNSr2c=
答案 1 :(得分:1)
我不知道这个主题是否已经关闭,我刚刚为我解决了同样的问题,所以......
实际上,您似乎只需安装crytpoJS:
npm install crypto-js --save
导入您要使用的精确文件/库:
import { SHA3 } from "crypto-js"; // SHA3 one-way encryption
import { AES } from 'crypto-js'; // For AES encryption/decryption
import { enc } from 'crypto-js'; // For characters encodages types (Utf-8, latin1...)
现在您可以直接使用导入库的名称来使用CryptoJs函数:
//AES
let encrypted = AES.encrypt('my message', 'secret key 123');
let bytes = AES.decrypt(encrypted.toString(), 'secret key 123');
let decrypted = bytes.toString(enc.Utf8);
//SHA
let hash = SHA3('password', { outputLength: 224 }).toString()
也许有一天它会帮助别人......
问候。
答案 2 :(得分:0)
你是正确的,因为离子使用@types而不是打字。
首先
import * as CryptoJS from 'crypto-js';
应该是
import 'crypto-js';
在这种特定情况下,crypto js不是一个合适的节点模块,因此导入到一般文件
除非您安装了打字稿,否则打字稿中也没有要求,而是导入。所以这没有意义:
this.CryptoJS = require("crypto-js");
这声明了一个空变量:
private CryptoJS: any;
如果您将其翻译为javascript,它将如下所示:
var CryptoJS;
所以这基本上是多余的。您已经拥有导入中的变量
总结一下,这应该是你的代码:
import CryptoJS from 'crypto-js';
class SomeClass{
test(){
alert(CryptoJS);
}
}