加密与解密是保证通讯安全的一种重要手段,现在加密算法已经有很多,并且都有成熟的软件包可以使用,这就大大降低了应用开发程序员的负担,只需要使用这些第三方提供的加密解密库就可以使用了,在Node.js中其实提供了一个非常强大而且方便的加密与解密模块crypto,我们不需要使用第三方的NPM库就能实现简单的加密与解密功能,毕竟使用加密与解密的目的就是为了保证通讯的安全,而使用非官方的第三方库总是有可能存在添加的后门或者什么的,而使用Node.js自带的crypto模块就能最大程度的保证加密的安全性。

哈希值计算 crypto.Hash

哈希值计算通常是用来对数据完整性和正确性做一个校验目的使用,当我们需要确保接受的数据是跟发送的数据一毛一样的时候,就可以通过分别计算发送数据的哈希值和接收到数据的哈希值。做一个简单的比较就能判断出来,两个一样的数据得到的哈希值肯定是一样的。哈希值不能逆向计算还原成原来的数据,所以只能用来验证数据。那么在Node.js中该如何使用呢?

示例代码

const crypto = require('crypto');
const hash = crypto.createHash('sha256');

hash.update('some data to hash');
console.log(hash.digest('hex'));
// Prints:
//   6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50

上面的代码是抄录自Node.js官方演示代码,我选择了其中最简单的使用方式,这种使用方式也是我们最常使用的,那就是对一个字符串或者一组数据进行哈希值计算。crypto.Hash实现的哈希算法是使用固定的秘语Secret作为计算的算子,Node.js中还有一个与其类似的,但是可以改变秘语Secret的加密类crypto.Hmac。

可变哈希计算 crypto.Hmac

示例代码

const crypto = require('crypto');
const hmac = crypto.createHmac('sha256', 'a secret');

hmac.update('some data to hash');
console.log(hmac.digest('hex'));
// Prints:
//   7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e

crypto.Hmac的使用方法与crypto.Hash很相似,唯一不同点就是多了一个可以自定义的秘语Secret,使用定制的秘语Secret的一个用途就是保存密码的时候可以提高安全性,毕竟使用默认秘语Secret的哈希算法函数,只要知道使用了什么算法就能通过暴力碰撞获取到密码,但是使用了定制秘语Secret的哈希函数,就算是使用穷举法也几乎是不可能破解的。

对称加密与解密

对称加密与解密的意思是加密与解密双方使用同一个秘语Secret实现加解密算法运算,这种加密算法不需要什么公钥和私钥,使用起来比较方便,而且与哈希算法不同,对称加密解密是可以双向互逆运算的。

Node.js中支持许多对称加密算法,不过到底有哪些加密算法是取决于你计算机中安装的OpenSSL决定的,Node.js只是去调用了OpenSSL。这就给我们带来一个麻烦,那就是没有办法在文档中查找加密算法信息,这个之后就会知道麻烦在哪里。

对称加密使用过程

加密示例代码

 const crypto = require('crypto');

 const algorithm = 'aes-192-cbc';
 const password = 'Password used to generate key';
// Use the async `crypto.scrypt()` instead.
 const key = crypto.scryptSync(password, 'salt', 24);
// Use `crypto.randomBytes` to generate a random iv instead of the static iv
// shown here.
 const iv = Buffer.alloc(16, 0); // Initialization vector.

 const cipher = crypto.createCipheriv(algorithm, key, iv);

 let encrypted = cipher.update('some clear text data', 'utf8', 'hex');
 encrypted  = cipher.final('hex');
 console.log(encrypted);
// Prints: e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa

让我们一步一步的来解释这个代码吧。

const algorithm = 'aes-192-cbc';

这一行是定义所使用的加密算法,通常有3个部分组成,中间用-连接,第一部分是加密算法名称aes,第二部分是加密长度192位,第三部分是加密认证方法(这部分可能理解有误)cbc

 const key = crypto.scryptSync(password, 'salt', 24);

这一行是生成密钥Key,注意最后的数字24,这个是生成的密钥Key长度,最小是8,最大没限制不过必须是8的倍数才行,密钥Key的长度是跟所用的加密算法相关的,因为文档中没有这部分信息,所以使用的时候只能不断的尝试,否则就会报错!

 const iv = Buffer.alloc(16, 0); // Initialization vector.
 const cipher = crypto.createCipheriv(algorithm, key, iv);

第6行是创建初始向量Initialization vector,这也是一个非常关键但是文档中没有说明的地方,IV的长度也很关键,目前只知道长度必须是8的倍数,而且长度是跟所使用的算法位数是相关的,但是文档中没有地方明确说明,所以使用的时候也只能是不断尝试。

密钥Key和初始向量Initialization vector这两个关键参数的长度没有在Node.js文档中写明确是非常遗憾的,导致我们使用的时候要么去查加密算法相关资料,要么只能一个一个手动尝试,非常的不方便。

 let encrypted = cipher.update('some clear text data', 'utf8', 'hex');
 encrypted  = cipher.final('hex');

这两行就很简单了,就是对输入的字符串进行加密计算,update(...,'utf8', 'hex')中utf8是加密前字符串的编码格式,hex是加密后输出的编码格式。最后需要在加密后的字符串后面添加一个结束字符,这个工作由final('hex')完成,hex也是输出的字符编码格式。

对称解密过程

解密示例代码

const crypto = require('crypto');

const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// Use the async `crypto.scrypt()` instead.
const key = crypto.scryptSync(password, 'salt', 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.

const decipher = crypto.createDecipheriv(algorithm, key, iv);

// 上面是加密部分
// 因为加密和解密的密钥和初始向量要一致
// 所以就把加密和解密合并书写

// Encrypted using same algorithm, key and iv.
const encrypted =
  'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa';
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
decrypted  = decipher.final('utf8');
console.log(decrypted);
// Prints: some clear text data

解密就是加密的逆过程,注意点也是一样的,就是密钥Key和初始向量Initialization vector这两个参数的长度,还有一点要要注意的是decipher.update输入的第一个参数只能是字符串,不能是Buffer类型,个人感觉用Buffer性能应该会更好点,可能以后会增加这个类型支持吧。

结语

到此这篇关于详解使用Nodejs内置加密模块实现对等加密与解密的文章就介绍到这了,更多相关Nodejs对等加密与解密内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

详解使用Nodejs内置加密模块实现对等加密与解密的更多相关文章

  1. nodejs npm package.json中文文档

    这篇文章主要介绍了nodejs npm package.json中文文档,本文档中描述的很多行为都受npm-config(7)的影响,需要的朋友可以参考下

  2. PHP rsa加密解密算法原理解析

    这篇文章主要介绍了PHP rsa加密解密算法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

  3. 浅析Nodejs npm常用命令

    这篇文章主要介绍了浅析Nodejs npm常用命令的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下

  4. nodejs 使用nodejs-websocket模块实现点对点实时通讯

    这篇文章主要介绍了nodejs 使用nodejs-websocket模块实现点对点实时通讯的实例代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

  5. nodeJs链接Mysql做增删改查的简单操作

    本篇文章主要介绍了nodeJs链接Mysql做增删改查的简单操作,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  6. Nodejs中使用captchapng模块生成图片验证码

    本篇文章主要介绍了Nodejs中使用captchapng模块实现图片验证码,非常具有实用价值,需要的朋友可以参考下

  7. nodejs 图片预览和上传的示例代码

    本篇文章主要介绍了nodejs 图片预览和上传的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  8. nodejs中函数的调用实例详解

    本文通过实例代码给大家介绍了nodejs函数的调用,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

  9. NodeJS使用formidable实现文件上传

    这篇文章主要为大家详细介绍了NodeJS使用formidable实现文件上传的相关方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Nodejs获取网络数据并生成Excel表格

    这篇文章主要为大家详细介绍了Nodejs获取网络数据并生成Excel表格的具体实现方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

随机推荐

  1. Error: Cannot find module ‘node:util‘问题解决

    控制台 安装 Vue-Cli 最后一步出现 Error: Cannot find module 'node:util' 问题解决方案1.问题C:\Windows\System32>cnpm install -g @vue/cli@4.0.3internal/modules/cjs/loader.js:638 throw err; &nbs

  2. yarn的安装和使用(全网最详细)

    一、yarn的简介:Yarn是facebook发布的一款取代npm的包管理工具。二、yarn的特点:速度超快。Yarn 缓存了每个下载过的包,所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率,因此安装速度更快。超级安全。在执行代码之前,Yarn 会通过算法校验每个安装包的完整性。超级可靠。使用详细、简洁的锁文件格式和明确的安装算法,Yarn 能够保证在不同系统上无差异的工作。三、y

  3. 前端环境 本机可切换node多版本 问题源头是node使用的高版本

    前言投降投降 重头再来 重装环境 也就分分钟的事 偏要折腾 这下好了1天了 还没折腾出来问题的源头是node 使用的高版本 方案那就用 本机可切换多版本最终问题是因为nodejs的版本太高,导致的node-sass不兼容问题,我的node是v16.14.0的版本,项目中用了"node-sass": "^4.7.2"版本,无法匹配当前的node版本根据文章的提

  4. nodejs模块学习之connect解析

    这篇文章主要介绍了nodejs模块学习之connect解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. nodejs npm package.json中文文档

    这篇文章主要介绍了nodejs npm package.json中文文档,本文档中描述的很多行为都受npm-config(7)的影响,需要的朋友可以参考下

  6. 详解koa2学习中使用 async 、await、promise解决异步的问题

    这篇文章主要介绍了详解koa2学习中使用 async 、await、promise解决异步的问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. Node.js编写爬虫的基本思路及抓取百度图片的实例分享

    这篇文章主要介绍了Node.js编写爬虫的基本思路及抓取百度图片的实例分享,其中作者提到了需要特别注意GBK转码的转码问题,需要的朋友可以参考下

  8. CentOS 8.2服务器上安装最新版Node.js的方法

    这篇文章主要介绍了CentOS 8.2服务器上安装最新版Node.js的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  9. node.js三个步骤实现一个服务器及Express包使用

    这篇文章主要介绍了node.js三个步骤实现一个服务器及Express包使用,文章通过新建一个文件展开全文内容,具有一定的参考价值,需要的小伙伴可以参考一下

  10. node下使用UglifyJS压缩合并JS文件的方法

    下面小编就为大家分享一篇node下使用UglifyJS压缩合并JS文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

返回
顶部