Node之加密与解密处理
crypto模块概述
在Node.js中,使用OpenSSL类库作为其内部实现加密与解密处理的基础手段,这是因为目前OpenSSL已经成为了一个经过严格测试的可靠的加密与解密算法的实现工具。
在Node.js中,OpenSSL类库被封装在crypto模块中,因此开发者可以使用crypto模块来实现各种不同的加密与解密处理。例如,crypto模块中包含了类似MD5或SHA-1之类的散列算法。开发者也可以通过crypto模块来实现HMAC运算 [1]。在crypto模块中,提供了一些加密方法来实现数据的可靠加密。另外,在crypto模块中,也提供了一些利用HMAC运算来实现数字签名以及对数字签名进行验证的方
法。
查看Node.js中能够使用的所有加密算法
在crypto模块中,为每一种加密算法定义了一个类。可以使用getCiphers方法
来查看Node.js中能够使用的所有加密算法。
crypto.getCiphers()
查看Node.js中能够使用的所有散列算法
可以使用getHashes方法来查看在Node.js中能够使用的所有散列算法。
crypto.getHashes()
散列算法
散列(哈希)算法用来实现一些重要处理,例如,在允许对一段数据进行验证的前提下,将数据进行模糊化,或者为一大段数据提供一个验证码
在node中,为了使用散列算法,首先应该使用createHash方法创建一个hash对象。
let hash=crypto.createHash(algorithm)
- algorithm:参数值为一个在Node.js中可以使用的算法,如’sha1’、‘md5’、‘sha256’、'sha512’和’ripemd160’等,用于指定需要使用的散列算法,该方法返回被创建的hash对象
在创建一个hash对象后可以通过使用该对象的update方法创建一个摘要。该方法的使用方式如下所示
hash.update(data,[input_encoding])
- data:参数值为一个Buffer对象或一个字符串,用于指定摘要内容
- input_encoding:用于指定摘要内容所需使用的编码格式,可指定参数值为“utf8”、“ascii”或“binary”。如果不使用input_encoding参数,则data参数值必须为一个Buffer对象。可以在摘要被输出前使用多次update方法来添加摘要内容。
输出摘要内容
可以使用hash对象的digest方法来输出摘要内容。在使用了hash对象的digest方法后,不能再向hash对象中追加摘要内容。
hash.digest([encoding])
在hash对象的digest方法中,使用一个可选参数,参数值为一个字符串,用于指定输出摘要的编码格式,可指定参数值为“hex”、“binary”及“base64”。如果使用了该参数,那么digest方法返回字符串格式的摘要内容,如果不使用该参数,那么digest方法返回一个Buffer对象。在hash对象的digest方法被调用之后,该对象不能再被使用。
散列算法完整使用示例
var crypto = require('crypto');
var fs = require('fs');
var shasum = crypto.createHash('sha1');
var s = fs.ReadStream('./app.js');
s.on('data', function(d) {shasum.update(d);
});
s.on('end', function() {var d = shasum.digest('hex');console.log(d);
});
HMAC算法
HMAC算法将散列算法与一个密钥结合在一起,以阻止对签名完整性的破坏。在Node.js中,为了使用HMAC算法,首先应该使用createHmac方法创建一个hmac对象。
crypto.createHmac(algorithm,key)
- algorithm:为一个在Node.js中可以使用的算法,例如’sha1’、‘md5’、‘sha256’、'sha512’和’ripemd160’等,用于指定我们所需要使用的散列算法。该方法返回被创建的hmac对象。
- key:参数值为一个字符串,用于指定一个PEM格式的密钥。
创建一个摘要
在hmac对象的update方法中,使用一个参数,其参数值为一个Buffer对象或一个字符串,用于指定摘要内容。可以在摘要被输出前使用多次update方法来添加摘要内容。
hmac.update(data)
输出摘要
可以使用hmac对象的digest方法输出摘要内容。在使用了hmac对象的digest方法后,不能再向hmac对象中追加摘要内容。
hmac.digest([encoding])
HMAC算法的使用示例
var crypto = require('crypto');
var fs = require('fs');
var pem = fs.readFileSync('key.pem');
var key = pem.toString('ascii');
var shasum = crypto.createHmac('sha1',key);
var s = fs.ReadStream('./app.js');
s.on('data', function(d) {shasum.update(d);
});
s.on('end', function() {var d = shasum.digest('hex');console.log(d);
});
公钥加密
加密数据
在crypto模块中,Cipher类用于对数据进行加密操作。在加密数据之前,首先需要创建一个cipher对象。可以通过如下所示的两种方法创建cipher对象。
1.createCipher方法:该方法使用指定的算法与密码来创建cipher对象。
crypto.createCipher(algorithm,password)
- algorithm:用于指定在加密数据时所使用的算法,例如“blowfish’”、“aes-256-cbc”等。
- password:用于指定加密时所使用的密码,参数值必须为一个二进制格式的字符串或一个Buffer对象。
2.createCipheriv方法:该方法使用指定的算法、密码与初始向量(Initialization Vector,IV)来创建cipher对象。该方法的使用方式如下:
crypto.createCipheriv(algorithm,password,iv)
- algorithm:用于指定在加密数据时所使用的算法,例如“blowfish’”、“aes-256-cbc”等。
- password:用于指定加密时所使用的密码,参数值必须为一个二进制格式的字符串或一个Buffer对象。
- iv:用于指定加密时所使用的初始向量,参数值必须为一个二进制格式的字符串或一个Buffer对象。
指定需要被加密的数据。
在创建了一个cipher对象后,可以通过使用该对象的update方法来指定需要被加密的数据。
cipher.update(data,[input_encoding],[output_encoding])
- data:为必须使用的参数,为一个Buffer对象或一个字符串,用于指定需要加密的数据
- input_encoding:用于指定被加密的数据所需使用的编码格式,可指定参数值为“utf8”、“ascii”及“binary”。
- output_encoding:用于指定输出加密数据时使用的编码格式,可指定参数值为“hex”、“binary”或“base64”。
返回加密数据。
可以使用cipher对象的final方法来返回加密数据。当该方法被调用时,任何cipher对象中所缓存的数据都将被加密,如果加密数据的字节数不足以创建一个块,将使用PKCS填充方式来填充这个块。在使用了cipher对象的final方法后,不能再向cipher对象中追加加密数据。
cipher.final([output_encoding])
- output_encoding:参数值为一个字符串,用于指定在输出加密数据的编码格式,可指定参数值为“hex”、“binary”及“base64”。如果使用了该参数,那么final方法返回字符串格式的加密数据,如果不使用该参数,那么final方法返回一个Buffer对象。当cipher对象的final方法被调用之后,该对象不能再被使用。
使用cipher对象加密数据
var crypto = require('crypto');
var fs = require('fs');
var pem = fs.readFileSync('key.pem');
var key = pem.toString('ascii');
var cipher = crypto.createCipher('blowfish', key);
var text = "test";
cipher.update(text,'binary','hex');
var crypted=cipher.final('hex')
console.log(crypted);
解密数据
在crypto模块中,Decipher类用于对加密后的数据进行解密操作。在解密数据之前,首先需要创建一个decipher对象。可以通过如下所示的两种方法创建decipher对象。
1.createDecipher方法:该方法使用指定的算法与密码来创建decipher对象。
crypto.createDecipher(algorithm,password)
- algorithm:用于指定在解密数据时所使用的算法,例如“blowfish”、“aes-256-cbc”等,该算法必须与加密该数据时所使用的算法保持一致。
- password:用于指定解密时所使用的密码,其参数值必须为一个二进制格式的字符串或一个Buffer对象,该密码必须与加
密该数据时所使用的密码保持一致。
2.createDecipheriv方法:该方法使用指定的算法、密码与初始向量来创建decipher对象。
crypto.createDecipheriv(algorithm,password,iv)
- algorithm:用于指定在解密数据时所使用的算法,例如“blowfish”、“aes-256-cbc”等,该算法必须与加密该数据时所使用的算法保持一致。
- password:用于指定解密时所使用的密码,其参数值必须为一个二进制格式的字符串或一个Buffer对象,该密码必须与加
密该数据时所使用的密码保持一致。 - iv:用于指定解密时所使用的初始向量,参数值必须为一个二进制格式的字符串或一个Buffer对象,该初始向量必须与加密该数据时所使用的初始向量保持一致。
createDecipheriv方法返回一个被创建的decipher对象。
数据解密
在创建了一个decipher对象之后,可以通过使用该对象的update方法来指定需要被解密的数据。
decipher.update(data,[input_encoding],[output_encoding])
返回经过解密之后的原始数据
decipher.final([output_encoding])
创建签名
在网络中,私钥的拥有者可以在一段数据被发送之前先对该数据进行签名操作,在签名的过程中,将对这段数据执行加密处理。在经过加密后的数据发送之后,数据的接收者可以通过公钥的使用来对该签名进行解密及验证操作,以确保这段数据是私钥的拥有者所发出的原始数据,且在网络的传输过程中未被修改。
在Node.js中,在进行签名操作之前,首先需要使用createSign方法创建一个sign对象
crypto.createSign(algorithm)
- algorithm:指定加密算法
createSign方法返回被创建的sign对象。
指定加密数据
在创建了一个sign对象后,可以通过使用该对象的update方法来指定需要被加密的数据。
sign.update(data)
在sign对象的update方法中,使用一个参数,其参数值为一个Buffer对象或一个字符串,用于指定需要被加密的数据。可以在对数据进行签名前使用多次update方法来添加数据。
对数据进行签名
可以使用sign对象的sign方法对数据进行签名。在使用了sign对象的sign方法之后,不能再使用sign对象的update方法追加数据。
sign.sign(private_key,[output_format])
- private_key:为一个字符串,用于指定PEM格式的私钥。
- output_format:用于指定签名输出时所使用的编码格式,可指定参数值为“hex”、“binary”或“base64”。
签名验证
在crypto模块中,Verify类用于对签名进行验证操作。在对签名进行验证之前,首先需要创建一个verify对象,可以通过createVerify方法创建verify对象
crypto.createVerify(algorithm)
- algorithm:用于指定在验证签名数据时所使用的算法
createVerify方法返回一个被创建的verify对象。
指定需要被验证的数据
verify.update(data)
可以使用verify对象的verify方法来对签名进行验证。
verify.verify(object,signature,[signature_format])
- object:用于指定验证时所使用的对象,参数值为一个字符串,该字符串值可以为一个RSA公钥、一个DSA公钥或一个X.509证书。
- signature:必须为sign对象,用于指定被验证的签名。
- signature_format:用于指定在生成该签名时所使用的编码格式,可指定参数值为“hex”、“binary”及“base64”。
使用verify对象对签名进行验证
var crypto = require('crypto');
var fs = require('fs');
var privatePem = fs.readFileSync('key.pem');
var publicPem = fs.readFileSync('cert.pem');
var key = privatePem.toString();
var pubkey = publicPem.toString();
var data = "test"
var sign = crypto.createSign('RSA-SHA256');
sign.update(data);
var sig = sign.sign(key, 'hex');
var verify = crypto.createVerify('RSA-SHA256');
verify.update(data);
console.log(verify.verify(pubkey, sig, 'hex'));
压缩与解压缩处理
在Node.js中,可以使用zlib模块进行压缩及解压缩处理,在该模块内部使用zlib类库实现这些处理。具体不做描述,可见node官方文档
Node之加密与解密处理相关推荐
- PDF加密、解密内幕(一) PDF加密字典对象分析
PDF加密.解密内幕(一) - PDF加密字典对象分析 0 几个关键词的说明 PDF加密有两个口令即:Owner(to set the pdf document Permission or chang ...
- vue项目中加密和解密
Vue项目使用AES做加密 aes.js 文件内容如下: // test under node v6.11.1 const crypto = require("crypto"); ...
- PDF加密、解密内幕(一)- (PDF加密字典对象分析)
PDF加密.解密内幕(一) - PDF加密字典对象分析 0 几个关键词的说明 PDF加密有两个口令即:Owner(to set the pdf document Permission or chang ...
- 不错的威盾PHP加密专家解密算法
<?php /*********************************** *威盾PHP加密专家解密算法 http://www.my400800.cn **************** ...
- 数字证书采用公钥体制进行加密和解密。每个用户有一个私钥,用它进行 (46)。。。
数字证书采用公钥体制进行加密和解密.每个用户有一个私钥,用它进行 (46) : 同时每个用户还有一个公钥,用于 (47) . X.509标准规定,数字证书由 (48) 发放,将其放入公共目录中,以供用 ...
- 如何在 Linux 上用密码加密和解密文件
age 是一个简单的.易于使用的工具,允许你用一个密码来加密和解密文件.age 能帮你这样做.它是一个小型且易于使用的工具,允许你用一个密码加密一个文件,并根据需要解密. age 是一个简单的.易于使 ...
- tkinter实现文件加密和解密
源代码:https://gitee.com/mydreamambitious/file-encryption-and-decryption 注:这个代码和界面是做好的,但是还在进行优化和美化中.但是在 ...
- python 加密和解密
python 加密和解密 安装 linux pip3 install pycryptodome windows pip install pycryptodomex 创建密钥 from Cryptodo ...
- 探讨.NET Core中实现AES加密和解密以及.NET Core为我们提供了什么方便!
前言 对于数据加密和解密每次我都是从网上拷贝一份,无需有太多了解,由于在.net core中对加密和解密目前全部是统一了接口,只是做具体的实现,由于遇到过问题,所以将打算基本了解下其原理,知其然足矣, ...
最新文章
- android上方导航条跳转页面,《成为大前端》系列 7. 多页面、页面跳转和Navigation模块...
- Linux文件,文件描述符以及dup()和dup2()
- GO 跟C++/C差异
- 【Java多线程】sleep与yield的辨析
- python xlwt写入已有表_Python中,添加写入数据到已经存在的Excel文件
- 精细化管理设备资产,降低企业运营成本
- Mac怎么方便看节假日安排,添加中国法定节假日安排
- ios core plot设置xy坐标
- 超高颜值高性价比蓝牙耳机,2021学生党最爱平价蓝牙耳机推荐
- Intellij IDEA 在win10 中输入法的输出框不跟随
- Android 常用图片框架对比
- 哈工大深圳计算机就业质量报告,多所高校公布毕业生平均年薪,南京大学和哈工大(深圳)数据亮眼...
- GFP-GAN论文阅读笔记
- 华中科技大学成立人工智能学院,两名长江学者坐镇
- Linux系统设置root用户密码
- 树莓派摄像头安装及配置
- 使用Rola模块进行的无线中继数据传输实验
- 不同网络环境下的Mysql数据库远程连接(局域网或外网)
- HTML页面制作标签学习
- Arch KDE Plasma 显示和字体调整