nodeJS之crypto模块公钥加密及解密
nodeJS之crypto模块公钥加密及解密
NodeJS有以下4个与公钥加密相关的类。
1. Cipher: ⽤于加密数据;
2. Decipher: ⽤于解密数据;
3. Sign: ⽤于⽣成签名;
4. Verify: ⽤于验证签名;
在使⽤公钥加密技术时,需要使⽤公钥及私钥,公钥是⽤于创建只有私钥的拥有者能够读出的加密数据,以及对私钥的拥有者的签名进⾏验证;私钥是⽤于解密数据以及对数据进⾏签名。
⼀:加密数据
在crypto模块中,Cipher类⽤于对数据进⾏加密操作;我们可以通过如下两种⽅式创建cipher对象;
1.1 createCipher⽅法;该⽅法使⽤指定的算法与密码来创建cipher对象。该⽅法使⽤⽅式如下:
该⽅法使⽤两个参数,第⼀个参数⽤于指定在加密数据时所使⽤的算法,⽐如 'ase-256-cbc'这些等,第⼆个参数⽤于指定加密时所使⽤的密码,该参数值必须为⼀个⼆进制格式的字符串或⼀个Buffer对象。
createCipher ⽅法返回⼀个被创建的cipher对象。
1.2 createCipheriv⽅法;该⽅法使⽤指定的算法、密码与初始向量、来创建cipher对象,使⽤⽅法如下所⽰:
nodejs到底是干嘛用的呢
该⽅法的第⼀个参数是在加密数据时所使⽤的算法,⽐如 'ase-256-cbc'等等,第⼆个参数⽤于指定加密时所使⽤的密码,该参数值必须为⼀个⼆进制格式的字符串或⼀个Buffer对象。第三个参数指定加密时所使⽤的初始向量,参数值也必须为⼀个⼆进制格式的字符串或⼀个Buffer对象。
该⽅法返回的也是⼀个被创建的cipher对象。
1.3 在上⾯通过两种⽅式创建了cipher对象后,可以通过使⽤该对象的update⽅法来指定需要被加密的数据,该⽅法使⽤的⽅式如下:cipher.update(data, [input_encoding], [output_encoding])
其中第⼀个参数为必选项(其他的参数为可选项), 该参数值是⼀个Buffer对象或⼀个字符串,⽤于指定需要加密的数据。第⼆个参数⽤于指定被加密的数据所使⽤的编码格式,可指定参数值为 'utf-8', 'ascii' 或 'binary'. 如果不使⽤第⼆个参数的话,那么第⼀个参数必须为⼀个Buffer对象。
第三个参数⽤于指定输出加密数据时使⽤的编码格式,可指定的参数值为 'hex', 'binary' 或 'base64' 等。如果不使⽤第三个参数的话,该⽅法就返回了⼀个存放了加密数据的Buffer对象。
1.4 可以使⽤cipher对象的final⽅法来返回加密数据。当该⽅法被调⽤时,任何cipher对象中所缓存的数据都将被加密。在使⽤了cipher对象的final⽅法
后,不能再向cipher对象中追加加密数据,该⽅法使⽤⽅式如下:
cipher.final([output_encoding]);
该⽅法使⽤⼀个可选参数,该参数值为⼀个字符串,⽤于指定在输出加密数据的编码格式,可指定参数值为 'hex', 'binary', 及 'base64'. 如果使⽤了
该参数,那么final⽅法返回字符串格式的加密数据,如果不使⽤该参数,那么该⽅法就返回⼀个Buffer对象。
具体使⽤的代码如下:
const crypto = require('crypto');
/*
下⾯是使⽤加密算法对 '我不是笨蛋' ⼏个字进⾏加密,所加密使⽤的密码是 123456
*/
const data = '我不是笨蛋';
const password = '123456';
// 创建加密算法
const aseEncode = function(data, password) {
// 如下⽅法使⽤指定的算法与密码来创建cipher对象
const cipher = ateCipher('aes192', password);
// 使⽤该对象的update⽅法来指定需要被加密的数据
let crypted = cipher.update(data, 'utf-8', 'hex');
crypted += cipher.final('hex');
return crypted;
};
console.log(aseEncode(data, password)); // 输出 ebdf98c254b9aa5265f6d4a5e73f861d
⼆:解密数据
在crypto模块中,Decipher类⽤于对加密后的数据进⾏解密操作。
创建⼀个decipher对象,可以通过如下两种⽅式进⾏创建:
2.1 createDecipher⽅法,该⽅法使⽤指定的算法与密码来创建 decipher对象,该⽅法使⽤的⽅式如下:
在该⽅法中,第⼀个参数⽤于指定在解密数据时所使⽤的算法,⽐如 'aes-256-cbc'等,该算法必须与加密数据时所使⽤的算法保持⼀致。第⼆个参数⽤于指定解密时所使⽤的密码,其参数值为⼀个⼆进制格式的字符串或⼀个Buffer对象,该密码同样必须与加密该数据时所使⽤的密码保持⼀致。
createDecipher⽅法返回⼀个被创建的 decipher对象。
2.2 createDecipheriv⽅法;该⽅法使⽤指定的算法、密码与初始向量来创建decipher对象。该⽅法使⽤如下所⽰:
在该⽅法中,第⼀个参数⽤于指定在解密数据时所使⽤的算法,⽐如 'aes-256-cbc'等,该算法必须与加密数据时所使⽤的算法保持⼀致。第⼆个参数⽤于指定解密时所使⽤的密码,参数值必须为⼀个⼆进制格式的字符串或⼀个Buffer对象,同样的道理,该密码必须与加密该数据时所使⽤的密码保持⼀致。
第三个参数⽤于指定解密时所使⽤的初始向量,该参数值也必须为⼀个⼆进制格式的字符串或者⼀个Buffer对象,该初始向量必须与加密该数据时所使⽤的初始向量保持⼀致。
2.3 在创建了decipher对象之后,可以通过使⽤该对象的update⽅法来指定需要被解密的数据。该⽅法使⽤如下所⽰:
decipher.update(data, [input_encoding], [output_encoding]);
在该⽅法中,第⼀个参数为⼀个Buffer对象或⼀个字符串,⽤于指定需要被解密的数据,第⼆个参数⽤于指定被解密数据所使⽤的编码格式,可指定的参数值为 'hex', 'binary', 'base64'等,如果不使⽤第⼆个参数的话,那么参数值必须为⼀个buffer对象。第三个参数⽤于指定输出解密数据时使⽤的编码格式,可选参数值为'utf-8', 'ascii' 或 'binary';
2.4 可以使⽤decipher对象的final⽅法来返回经过解密之后的原始数据,该⽅法使⽤如下所⽰:
decipher.final([output_encoding]);
在该对象的final⽅法中,使⽤了⼀个可选参数,参数值为⼀个字符串,⽤于指定在输出解密数据时使⽤的编码格式,可指定参数值为 'utf-8', 'ascii' 或 'binary';
如果使⽤了该参数,final返回字符串格式的解密数据,如果不使⽤该参数,final⽅法返回⼀个Buffer对象。
如下解密数据的代码:
const crypto = require('crypto');
/*
下⾯是使⽤加密算法对 '我不是笨蛋' ⼏个字进⾏加密,所加密使⽤的密码是 123456
*/
const data = '我不是笨蛋';
const password = '123456';
// 创建加密算法
const aseEncode = function(data, password) {
// 如下⽅法使⽤指定的算法与密码来创建cipher对象
const cipher = ateCipher('aes192', password);
// 使⽤该对象的update⽅法来指定需要被加密的数据
let crypted = cipher.update(data, 'utf-8', 'hex');
crypted += cipher.final('hex');
return crypted;
};
console.log(aseEncode(data, password)); // 输出 ebdf98c254b9aa5265f6d4a5e73f861d
// 创建解密算法
const aseDecode = function(data, password) {
/*
该⽅法使⽤指定的算法与密码来创建 decipher对象, 第⼀个算法必须与加密数据时所使⽤的算法保持⼀致;
第⼆个参数⽤于指定解密时所使⽤的密码,其参数值为⼀个⼆进制格式的字符串或⼀个Buffer对象,该密码同样必须与加密该数据时所使⽤的密码保持⼀致
*/
const decipher = ateDecipher('aes192', password);
/*
第⼀个参数为⼀个Buffer对象或⼀个字符串,⽤于指定需要被解密的数据
第⼆个参数⽤于指定被解密数据所使⽤的编码格式,可指定的参数值为 'hex', 'binary', 'base64'等,第三个参数⽤于指定输出解密数据时使⽤的编码格式,可选参数值为 'utf-8', 'ascii' 或 'binary';
*/
let decrypted = decipher.update(data, 'hex', 'utf-8');
decrypted += decipher.final('utf-8');
return decrypted;
};
console.log(aseDecode(aseEncode(data, password), password)); // 输出我不是笨蛋