Nest.js散列与加密实例详解


Posted in Javascript onFebruary 24, 2021

0x0 前言

先要知道,什么是散列算法呢?产生一些数据片段(例如消息或会话项)的散列值的算法。例如,md5就是一种散列算法。软件开发中的散列函数或散列算法,又称哈希函数,英语:Hash Function,是一种从任何一种数据中创建小的数字“指纹”的方法。所有散列函数都有如下一个基本特性:如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。

加 密算法通常分为对称性加密算法和非对称性加密算法,对于对称性加密算法,信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行 加解密了。非对称算法与之不同,发送双方A,B事先均生成一堆密匙,然后A将自己的公有密匙发送给B,B将自己的公有密匙发送给A,如果A要给B发送消 息,则先需要用B的公有密匙进行消息加密,然后发送给B端,此时B端再用自己的私有密匙进行消息解密,B向A发送消息时为同样的道理。

散列和加密本质上都是将一个Object变成一串无意义的字符串,不同点是经过散列的对象无法复原,是一个单向的过程。例如,对密码的加密通常就是使用散列算法,因此用户如果忘记密码只能通过修改而无法获取原始密码。但是对于信息的加密则是正规的加密算法,经过加密的信息是可以通过秘钥解密和还原。

散列与加密

散列是给键值经过数学算法转换另外一个键值,在转换过程中是利用哈希函数生成,输出的内容无法还原,这边主要用于密码存储在数据需要进行散列处理。

加密是对信息编码,将原始信息转换成密文,一般用于客户端向服务器发送密码等敏感信息,发送之前对此信息加密,然后在服务器再进行解密。

0x1 散列

Node.js 生态有很多依赖,例如Bcrypt 和 Argon2 ,本身使用起来很简单,这次使用 Bcrypt 来实现散列过程:

yarn add bcrypt
yarn add @types/bcrypt -D

然后对散列的业务进行封装:

import { Injectable } from '@nestjs/common'
import * as bcrypt from 'bcrypt'

@Injectable()
export class BcryptService {
 private static readonly SALT_ROUNDS: number = 10
 /**
 * 对比检查密码
 * @param rawStr
 * @param hashedStr
 */
 async compare(rawStr: string, hashedStr: string) {
 return bcrypt.compare(rawStr, hashedStr)
 }
 /**
 * 生成 hash
 * @param rawStr
 * @param salt
 */
 async hash(rawStr: string, salt?: string) {
 return bcrypt.hash(rawStr, salt || BcryptService.SALT_ROUNDS)
 }
 /**
 * 生成盐
 */
 async genSalt() {
 return bcrypt.genSalt(BcryptService.SALT_ROUNDS)
 }
}

0x2 加密

Node.js 系统内自带 加密模块 ,可用于加密和解密等相关操作,下面进行使用 AES-256-CTR 加密方式对数据进行加密:

import { createCipheriv, randomBytes } from 'crypto'
import { promisify } from 'util'

const iv = randomBytes(16)
const password = 'Password used to generate key'

// 密钥长度取决于算法
// 在 aes256 情况下是 32 个字节长度
const key = (await promisify(scrypt)(password, 'salt', 32)) as Buffer
const cipher = createCipheriv('aes-256-ctr', key, iv)

const textToEncrypt = 'Nest'
const encryptedText = Buffer.concat([
 cipher.update(textToEncrypt),
 cipher.final()
])

如果需要解密也很简单:

import { createDecipheriv } from 'crypto'

const decipher = createDecipheriv('aes-256-ctr', key, iv)
const decryptedText = Buffer.concat([
 decipher.update(encryptedText),
 decipher.final()
])

0x3 参考

Encryption and Hashing

Node.js crypto

node.bcrypt.js

总结

到此这篇关于Nest.js散列与加密的文章就介绍到这了,更多相关Nest.js散列与加密内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
document.getElementById为空或不是对象的解决方法
Jan 24 Javascript
js中将HTMLCollection/NodeList/伪数组转换成数组的代码
Jul 31 Javascript
JavaScript之引用类型介绍
Aug 10 Javascript
利用js 进行输入框自动匹配字符的小例子
Jun 29 Javascript
jquery 选取方法都有哪些
May 18 Javascript
JS+CSS实现简易的滑动门效果代码
Sep 24 Javascript
AngularJS入门教程之过滤器用法示例
Nov 02 Javascript
Node.js实现用户评论社区功能(体验前后端开发的乐趣)
May 09 Javascript
vue 集成 vis-network 实现网络拓扑图的方法
Aug 07 Javascript
JavaScript原始值与包装对象的详细介绍
May 11 Javascript
vue中控制mock在开发环境使用,在生产环境禁用方式
Apr 06 Vue.js
Java无向树分析 实现最小高度树
Apr 09 Javascript
JS canvas实现画板和签字板功能
Feb 23 #Javascript
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
Feb 23 #Vue.js
js实现验证码干扰(动态)
Feb 23 #Javascript
js实现验证码干扰(静态)
Feb 22 #Javascript
JavaScript实现H5接金币功能(实例代码)
Feb 22 #Javascript
nestjs返回给前端数据格式的封装实现
Feb 22 #Javascript
NestJs使用Mongoose对MongoDB操作的方法
Feb 22 #Javascript
You might like
php中使用gd库实现下载网页中所有图片
2015/05/12 PHP
PHP自定义错误用法示例
2016/09/28 PHP
PHP进程通信基础之信号量与共享内存通信
2017/02/19 PHP
PHP实现链表的定义与反转功能示例
2018/06/09 PHP
关于COOKIE个数与大小的问题
2011/01/17 Javascript
类似php的js数组的in_array函数自定义方法
2013/12/27 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
2015/03/19 Javascript
Jquery组件easyUi实现表单验证示例
2016/08/23 Javascript
ES6记录异步函数的执行时间详解
2016/08/31 Javascript
jQuery焦点图左右转换效果
2016/12/12 Javascript
jQuery向webApi提交post json数据
2017/01/16 Javascript
jq stop()和:is(:animated)的用法及区别(详解)
2017/02/12 Javascript
jQuery插件HighCharts绘制2D带Label的折线图效果示例【附demo源码下载】
2017/03/08 Javascript
React入门教程之Hello World以及环境搭建详解
2017/07/11 Javascript
详解Angular CLI + Electron 开发环境搭建
2017/07/20 Javascript
webpack实现热加载自动刷新的方法
2017/07/30 Javascript
nodejs读取并去重excel文件
2018/04/22 NodeJs
一次Webpack配置文件的分离实战记录
2018/11/30 Javascript
Node.js EventEmmitter事件监听器用法实例分析
2019/01/07 Javascript
node中使用es6/7/8(支持性与性能)
2019/03/28 Javascript
浅谈一种让小程序支持JSX语法的新思路
2019/06/16 Javascript
nodejs文件夹深层复制功能
2019/09/03 NodeJs
JS实现纸牌发牌动画
2021/01/19 Javascript
[01:34]2016国际邀请赛中国区预选赛IG战队教练采访
2016/06/27 DOTA
python 获取文件列表(或是目录例表)
2009/03/25 Python
Python语言实现机器学习的K-近邻算法
2015/06/11 Python
浅析PHP与Python进行数据交互
2018/05/15 Python
python实现屏保程序(适用于背单词)
2019/07/30 Python
详解PyTorch中Tensor的高阶操作
2019/08/18 Python
python base64库给用户名或密码加密的流程
2020/01/02 Python
python批量修改xml属性的实现方式
2020/03/05 Python
利用CSS3的3D效果制作正方体
2020/03/10 HTML / CSS
h5封装下拉刷新
2020/08/25 HTML / CSS
Ray-Ban雷朋奥地利官网:全球领先的太阳眼镜品牌
2020/10/12 全球购物
司机岗位职责范本
2015/04/10 职场文书
继续教育心得体会(共6篇)
2016/01/19 职场文书