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之加密与解密处理相关推荐

  1. PDF加密、解密内幕(一) PDF加密字典对象分析

    PDF加密.解密内幕(一) - PDF加密字典对象分析 0 几个关键词的说明 PDF加密有两个口令即:Owner(to set the pdf document Permission or chang ...

  2. vue项目中加密和解密

    Vue项目使用AES做加密 aes.js 文件内容如下: // test under node v6.11.1 const crypto = require("crypto");  ...

  3. PDF加密、解密内幕(一)- (PDF加密字典对象分析)

    PDF加密.解密内幕(一) - PDF加密字典对象分析 0 几个关键词的说明 PDF加密有两个口令即:Owner(to set the pdf document Permission or chang ...

  4. 不错的威盾PHP加密专家解密算法

    <?php /*********************************** *威盾PHP加密专家解密算法 http://www.my400800.cn **************** ...

  5. 数字证书采用公钥体制进行加密和解密。每个用户有一个私钥,用它进行 (46)。。。

    数字证书采用公钥体制进行加密和解密.每个用户有一个私钥,用它进行 (46) : 同时每个用户还有一个公钥,用于 (47) . X.509标准规定,数字证书由 (48) 发放,将其放入公共目录中,以供用 ...

  6. 如何在 Linux 上用密码加密和解密文件

    age 是一个简单的.易于使用的工具,允许你用一个密码来加密和解密文件.age 能帮你这样做.它是一个小型且易于使用的工具,允许你用一个密码加密一个文件,并根据需要解密. age 是一个简单的.易于使 ...

  7. tkinter实现文件加密和解密

    源代码:https://gitee.com/mydreamambitious/file-encryption-and-decryption 注:这个代码和界面是做好的,但是还在进行优化和美化中.但是在 ...

  8. python 加密和解密

    python 加密和解密 安装 linux pip3 install pycryptodome windows pip install pycryptodomex 创建密钥 from Cryptodo ...

  9. 探讨.NET Core中实现AES加密和解密以及.NET Core为我们提供了什么方便!

    前言 对于数据加密和解密每次我都是从网上拷贝一份,无需有太多了解,由于在.net core中对加密和解密目前全部是统一了接口,只是做具体的实现,由于遇到过问题,所以将打算基本了解下其原理,知其然足矣, ...

最新文章

  1. android上方导航条跳转页面,《成为大前端》系列 7. 多页面、页面跳转和Navigation模块...
  2. Linux文件,文件描述符以及dup()和dup2()
  3. GO 跟C++/C差异
  4. 【Java多线程】sleep与yield的辨析
  5. python xlwt写入已有表_Python中,添加写入数据到已经存在的Excel文件
  6. 精细化管理设备资产,降低企业运营成本
  7. Mac怎么方便看节假日安排,添加中国法定节假日安排
  8. ios core plot设置xy坐标
  9. 超高颜值高性价比蓝牙耳机,2021学生党最爱平价蓝牙耳机推荐
  10. Intellij IDEA 在win10 中输入法的输出框不跟随
  11. Android 常用图片框架对比
  12. 哈工大深圳计算机就业质量报告,多所高校公布毕业生平均年薪,南京大学和哈工大(深圳)数据亮眼...
  13. GFP-GAN论文阅读笔记
  14. 华中科技大学成立人工智能学院,两名长江学者坐镇
  15. Linux系统设置root用户密码
  16. 树莓派摄像头安装及配置
  17. 使用Rola模块进行的无线中继数据传输实验
  18. 不同网络环境下的Mysql数据库远程连接(局域网或外网)
  19. HTML页面制作标签学习
  20. Arch KDE Plasma 显示和字体调整

热门文章

  1. k8s单节点无法启动pod
  2. SEM营销推广策略和优化,做好其实并不难!
  3. 有趣的三个水桶等分8升水问题
  4. js的tree转数组
  5. 微型投影仪第五篇——Metro UI
  6. 主机能ping通Ubuntu,Ubuntu无法ping通主机
  7. 20230326作业
  8. CPU是沙子做的,凭什么卖那么贵?
  9. 华为OD机试用Python实现 -【查找树中的元素 or 查找二叉树节点】(2023-Q1 新题)
  10. SVN更新出错 提示:working copy XXX locked