创建node工程
新建node工程,导入crypto-js
和crypto-browserify
的npm包。
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
var CryptoJS = require('crypto-js');
var crypto = require('crypto-browserify');
var key = '16位密钥';
var rsaKeyStr = ''RSA公钥';
var rsaBuffer = new Buffer(key);
// 使用RSA公钥加密AES的密钥
var cryptedData = crypto.publicEncrypt(rsaKeyStr, rsaBuffer);
//定义向量
var iv = 'qwertyuiasdfghjk';
key = CryptoJS.enc.Utf8.parse(key);
iv = CryptoJS.enc.Utf8.parse(iv);
//使用AES加密加密内容,这里用new Object 代替
var encrypted = CryptoJS.AES.encrypt(JSON.stringify(new Object(), key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
var encryptedObj = new Object();
encryptedObj.mhcParams = encrypted.toString();
encryptedObj.mhcToken = cryptedData.toString("base64");
|
注意有一个坑:
crypto.publicEncrypt(public_key, buffer)
传入的public_key
参数可以是一个Object,** If public_key is a string, it is treated as the key with no passphrase and will use RSA_PKCS1_OAEP_PADDING** :如果是个string,默认采用RSA_PKCS1_OAEP_PADDING
的padding方式。
通过webpack打包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
const name = 'SomeDemo';
const config = {
target: 'web',
entry: [
'./src/SomeDemo.js'
],
output:{
path: path.join(__dirname, './build/tech.suclogger.SomeDemo'),
pathInfo: true,
publicPath: '/build/',
filename: name + '.js'
},
module: {
loaders: [
{
loader: 'babel-loader',
include: [
path.resolve(__dirname, 'src')
],
test: /\.js$/
},
{
loader: 'json-loader',
include: [
path.resolve(__dirname, 'node_modules')
],
test: /\.json$/
}
]
}
};
module.exports = config;
|
注意有一个坑:
webpack does not natively support the loading of JSON files such as /constants-browserify/constants.json. What you should do is to use the json-loader plugin for webpack (https://www.npmjs.com/package/json-loader
webpack并不原生支持打包json格式文件,需要通过json-loader
这个插件来打包constants
。
非node环境下执行
发现报错:Error: secure random number generation not supported by this browser
非node环境不带crypto
,所以缺失crypto.getRandomValues()
方法,可以通过给打包出的js文件中添加:
1
2
3
4
5
6
7
8
9
10
|
var crypto = {
getRandomValues: function getRandomValues(array) {
var result = []
for (var i = 0, l = array.length; i < l ; i++){
result.push(Math.floor(Math.random()*256))
}
return result
}
};
|
模拟一个随机数的生成方法。