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)); // 输出  我不是笨蛋

原文地址:https://www.cnblogs.com/tugenhua0707/p/9131342.html

时间: 2024-10-04 07:35:29

nodeJS之crypto模块公钥加密及解密的相关文章

使用nodeJS的 crypto模块来为你的密码hash加盐

这篇文章将向你解释如何使用Node.js的Crypto模块对你的密码进行加盐hash.在这里,我们将不会对不懂的密码存储方式进行详细的比较.我们将要做的是知道在Node.js中使用加盐hash在进行密码存储的机制.放心,这是最好的存储密码的方式,在没有出现其他更好的方法之前. 这是什么技术 加盐是这样一直技术:将用户输入的密码和一个随机的字符串(这个字符串就是盐)通过hash结合,通过hash算法生成一个hash值,然后将结果存储在数据库中. 为什么要进行加盐Hash 因为相同密码的hash值是

Nodejs进阶:crypto模块中你需要掌握的安全基础知识

一. 文章概述 互联网时代,网络上的数据量每天都在以惊人的速度增长.同时,各类网络安全问题层出不穷.在信息安全重要性日益凸显的今天,作为一名开发者,需要加强对安全的认识,并通过技术手段增强服务的安全性. crypto模块是nodejs的核心模块之一,它提供了安全相关的功能,如摘要运算.加密.电子签名等.很多初学者对着长长的API列表,不知如何上手,因此它背后涉及了大量安全领域的知识. 本文重点讲解API背后的理论知识,主要包括如下内容: 摘要(hash).基于摘要的消息验证码(HMAC) 对称加

nodeJS之crypto加密

前面的话 加密模块提供了 HTTP 或 HTTPS 连接过程中封装安全凭证的方法.也提供了 OpenSSL 的哈希,hmac, 加密(cipher), 解密(decipher), 签名(sign) 和 验证(verify) 方法的封装.本文将详细介绍加密crypto crypto [crypto.setEngine(engine[, flags])] 为某些/所有 OpenSSL 函数加载并设置引擎(根据参数 flags 来设置). engine 可能是 id,或者是指向引擎共享库的路径. fl

RSA不对称加密,公钥加密私钥解密,私钥加密公钥解密

RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一.RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价. .NET提供常用的加密算法类,支持RSA的类是RSACryptoServiceProvider(命名空间:System.Security.Cryptography),但只支持公钥加密,私钥解密.RSACr

Crypto 模块安装

crypto模块的目的是为了提供通用的加密和哈希算法. AES是一种常用的对称加密算法,加解密都用同一个密钥.crypto模块提供了AES支持,但是需要自己封装好函数,便于使用 方法一: 1,到 https://www.dlitz.net/software/pycrypto/ 下载pycrypto (这里注意不是Crypto,Crypto是C++里面的算法) 2,解压zip文件后在当前目录执行 python setup.py install 方法二: 直接 pip install pycrypt

nodejs的require模块及路径

在nodejs中,模块大概可以分为核心模块和文件模块. 核心模块是被编译成二进制代码,引用的时候只需require表示符即可,如(require('net')). 文件模块,则是指js文件.json文件或者是.node文件.在引用文件模块的时候后要加上文件的路径:/-/-/xxx.js表示绝对路径../xxx.js表示相对路径(同一文件夹下的xxx.js),../表示上一级目录.如果既不加/-/.../又不加./的话,则该模块要么是核心模块,要么是从一个node_modules文件夹加载. 对于

RSA公钥加密—私钥解密&私钥加密—公钥解密&私钥签名—公钥验证签名

关于RSA算法,前面有介绍,点击打开链接. 这里直接有实现. 代码太多就不直接贴了,免积分下载. http://download.csdn.net/detail/acmjk/7310847 RSA公钥加密-私钥解密&私钥加密-公钥解密&私钥签名-公钥验证签名,布布扣,bubuko.com

如何编写package.json配置NodeJS项目的模块声明

在NodeJS项目中,用package.json文件来声明项目中使用的模块,这样在新的环境部署时,只要在package.json文件所在的目录执行 npm install 命令即可安装所需要的模块. package.json文件中可配置的项有:名称(name).应用描述(description).版本号(version).应用的配置项(config).作者(author).资源仓库地址(repository).授权方式(licenses).目录(directories).应用入口文件(main)

nodejs学习(模块的简单了解)

1.模块模块(Module)是nodejs最重要的支柱,开发一个具有一定规范的程序不可能只用一个文件, 通常我们需要把各个功能拆分,封装,然后在组合在一起,模块正是为了现在这种方式而诞 生的.在浏览器的javascript中,脚本模块的拆分和组合通常情况下我们都使用Html的 Script标签来实现,但是nodejs给我们提供了require这个函数来调用其他的模块.-----------------------------------------------------------------