nodeJS之crypto模块公钥加密及解密
nodeJS之crypto模块公钥加密及解密
NodeJS有以下4个与公钥加密相关的类。
1. Cipher: 用于加密数据;
2. Decipher: 用于解密数据;
3. Sign: 用于生成签名;
4. Verify: 用于验证签名;
在使用公钥加密技术时,需要使用公钥及私钥,公钥是用于创建只有私钥的拥有者能够读出的加密数据,以及对私钥的拥有者的签名进行验证;私钥是用于解密数据以及对数据进行签名。
一:加密数据
在crypto模块中,Cipher类用于对数据进行加密操作;我们可以通过如下两种方式创建cipher对象;
1.1 createCipher方法;该方法使用指定的算法与密码来创建cipher对象。该方法使用方式如下:
crypto.createCipher(params, pasword);
该方法使用两个参数,第一个参数用于指定在加密数据时所使用的算法,比如 'ase-256-cbc'这些等,第二个参数用于指定加密时所使用的密码,该参数值必须为一个二进制格式的字符串或一个Buffer对象。
createCipher 方法返回一个被创建的cipher对象。
1.2 createCipheriv方法;该方法使用指定的算法、密码与初始向量、来创建cipher对象,使用方法如下所示:
crypto.createCipheriv(params, password, iv);
该方法的第一个参数是在加密数据时所使用的算法,比如 '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 = crypto.createCipher('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对象,该方法使用的方式如下:
crypto.createDecipher(params, password);
在该方法中,第一个参数用于指定在解密数据时所使用的算法,比如 'aes-256-cbc'等,该算法必须与加密数据时所使用的算法保持一致。
第二个参数用于指定解密时所使用的密码,其参数值为一个二进制格式的字符串或一个Buffer对象,该密码同样必须与加密该数据时所使用的密码保持一致。
createDecipher方法返回一个被创建的 decipher对象。
2.2 createDecipheriv方法;该方法使用指定的算法、密码与初始向量来创建decipher对象。该方法使用如下所示:
crypto.createDecipheriv(params, password, iv);
在该方法中,第一个参数用于指定在解密数据时所使用的算法,比如 '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 = crypto.createCipher('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 = crypto.createDecipher('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)); // 输出 我不是笨蛋
nodeJS之crypto模块公钥加密及解密的更多相关文章
- nodeJS之crypto模块md5和Hmac加密
nodeJS之crypto模块md5和Hmac加密 原文地址:https://www.cnblogs.com/tugenhua0707/p/9128690.html 在nodejs中,可以使用cryp ...
- 使用nodeJS的 crypto模块来为你的密码hash加盐
这篇文章将向你解释如何使用Node.js的Crypto模块对你的密码进行加盐hash.在这里,我们将不会对不懂的密码存储方式进行详细的比较.我们将要做的是知道在Node.js中使用加盐hash在进行密 ...
- Nodejs进阶:crypto模块中你需要掌握的安全基础
本文摘录自<Nodejs学习笔记>,更多章节及更新,请访问 github主页地址. 一. 文章概述 互联网时代,网络上的数据量每天都在以惊人的速度增长.同时,各类网络安全问题层出不穷.在信 ...
- NodeJS学习笔记 进阶 (12)Nodejs进阶:crypto模块之理论篇
个人总结:读完这篇文章需要30分钟,这篇文章讲解了使用Node处理加密算法的基础. 摘选自网络 Nodejs进阶:crypto模块之理论篇 一. 文章概述 互联网时代,网络上的数据量每天都在以惊人的速 ...
- Nodejs实战系列:数据加密与crypto模块
博客地址:<NodeJS模块研究 - crypto> Github :https://github.com/dongyuanxin/blog nodejs 中的 crypto 模块提供了各 ...
- 浅析nodeJS中的Crypto模块,包括hash算法,HMAC算法,加密算法知识,SSL协议
node.js的crypto在0.8版本,这个模块的主要功能是加密解密. node利用 OpenSSL库(https://www.openssl.org/source/)来实现它的加密技术, 这是因为 ...
- Nodejs进阶:MD5入门介绍及crypto模块的应用
本文摘录自<Nodejs学习笔记>,更多章节及更新,请访问 github主页地址.欢迎加群交流,群号 197339705. 简介 MD5(Message-Digest Algorithm) ...
- Nodejs:md5入门介绍及crypto模块的应用
简介 MD5(Message-Digest Algorithm)是计算机安全领域广泛使用的散列函数(又称哈希算法.摘要算法),主要用来确保消息的完整和一致性.常见的应用场景有密码保护.下载文件校验等. ...
- nodeJS之crypto加密
前面的话 加密模块提供了 HTTP 或 HTTPS 连接过程中封装安全凭证的方法.也提供了 OpenSSL 的哈希,hmac, 加密(cipher), 解密(decipher), 签名(sign) 和 ...
随机推荐
- ios -- 成员变量、实例变量与属性的区别
最近打开手机就会被胡歌主演的<猎场>刷屏,这剧我也一直在追,剧中的郑秋冬,因为传销入狱五年,却在狱中拜得名师孙漂亮(孙红雷),苦学HR,并学习了心理学,成功收获两样法宝.出狱后因为怕受 ...
- canvas-2drawRectFun.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 关于python访问字典的方法
def stu( **kwargs): # 在函数体内对于kwargs的使用不用带星号 print("大家好,我为大家简单自我介绍以下:") print(type(kwargs)) ...
- 【代码笔记】Web-JavaScript-JavaScript语法
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- 【转】巧用DOS tree命令+批处理 实现 指定文件 批量复制!
转自:http://www.cnblogs.com/looky/archive/2010/01/24/1655292.html 今天一朋友叫我帮忙解决指定文件批量复制的问题,于是找了一大堆批处理命令, ...
- (网页)HTML小技巧的一些小技巧
转自CSDN: 1.怎样定义网页语言(字符集)? 在制作网页过程中,你首先要定义网页语言,以便访问者浏览器自动设置语言,而我们用所见即所得的HTML工具时,都没有注意到这个问题, ...
- maven(七),本地仓库
运行机制: 在pom.xml文件中添加依赖jar包时,首先会从本地仓库查找,如果本地仓库不存在,就从中央仓库下载到本地仓库,中央仓库是maven默认的远程仓库 仓库坐标 eclipse默认会在wind ...
- python第八天)——购物车作业优化完成
发现之前的三级菜单代码有BUG现已经修改过来了 购物车程序:启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表允许用户根据商品编号购买商品用户选择商品后,检测余额是否够, ...
- ES6 入门
1.简介 ECMAScript 6.0 是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了.它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序, ...
- win10系统如何关掉系统自动更新
越来越多的电脑使用者都在使用Windows10系统,尽管系统是一代代更新的,但难免有槽点,Windows10系统也不例外,最大的槽点就是“自动更新”的功能.当然,“自动更新”的功能也是相当有用处的. ...