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 相关文章推荐
用Div仿showModalDialog模式菜单的效果的代码
Mar 05 Javascript
Jquery 1.42 checkbox 全选和反选代码
Mar 27 Javascript
JavaScript操作XML实例代码(获取新闻标题并分页,并分页)
May 25 Javascript
浅谈tudou土豆网首页图片延迟加载的效果
Jun 23 Javascript
jQuery学习笔记之jQuery动画效果
Sep 09 Javascript
JavaScript动态插入script的基本思路及实现函数
Nov 11 Javascript
javascript中的previousSibling和nextSibling的正确用法
Sep 16 Javascript
Vue Echarts实现可视化世界地图代码实例
May 07 Javascript
15分钟学会vue项目改造成SSR(小白教程)
Dec 17 Javascript
微信小程序单选框自定义赋值
May 26 Javascript
vue 保留两位小数 不能直接用toFixed(2) 的解决
Aug 07 Javascript
javascript实现下拉菜单效果
Feb 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
全国FM电台频率大全 - 12 安徽省
2020/03/11 无线电
destoon实现会员商铺中指定会员或会员组投放广告的方法
2014/08/21 PHP
PHP查看当前变量类型的方法
2015/07/31 PHP
浅析PHP中call user func()函数及如何使用call user func调用自定义函数
2015/11/05 PHP
PHP实现的微信公众号扫码模拟登录功能示例
2019/05/30 PHP
增强的 JavaScript 的 trim 函数的代码
2007/08/13 Javascript
用JQuery 实现AJAX加载XML并解析的脚本
2009/07/25 Javascript
基于jquery实现的文字淡入淡出效果
2013/11/14 Javascript
深入理解JQuery keyUp和keyDown的区别
2013/12/12 Javascript
js中window.open打开一个新的页面
2014/08/10 Javascript
javascript递归回溯法解八皇后问题
2015/04/22 Javascript
详解JavaScript的Polymer框架中的通知交互
2015/07/29 Javascript
配置Grunt的Task时通配符支持和动态生成文件名问题
2015/09/06 Javascript
浅谈js函数中的实例对象、类对象、局部变量(局部函数)
2016/11/20 Javascript
详解Weex基于Vue2.0开发模板搭建
2017/03/20 Javascript
Vue-router结合transition实现app前进后退动画切换效果的实例
2017/10/11 Javascript
总结js函数相关知识点
2018/02/27 Javascript
nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG的方法
2018/11/01 NodeJs
Vue+element+cookie记住密码功能的简单实现方法
2020/09/20 Javascript
[42:35]2018DOTA2亚洲邀请赛3月30日 小组赛A组 VG VS OpTic
2018/03/31 DOTA
[50:28]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs KG
2018/04/01 DOTA
Python进程间通信之共享内存详解
2017/10/30 Python
python3连接MySQL数据库实例详解
2018/05/24 Python
python 创建一个空dataframe 然后添加行数据的实例
2018/06/07 Python
python使用minimax算法实现五子棋
2019/07/29 Python
Python2比较当前图片跟图库哪个图片相似的方法示例
2019/09/28 Python
Python绘制三角函数图(sin\cos\tan)并标注特定范围的例子
2019/12/04 Python
通过Python实现一个简单的html页面
2020/05/16 Python
Canvas 帧动画吃苹果小游戏
2020/08/05 HTML / CSS
澳大利亚制造的羊皮靴:Original UGG Boots
2017/11/13 全球购物
英国门把手公司:Door Handle Company
2019/05/12 全球购物
西班牙品牌鞋子、服装和配饰在线商店:Esdemarca
2021/02/17 全球购物
系统管理员的职责包括那些?管理的对象是什么?
2013/01/18 面试题
车辆转让协议书
2014/04/15 职场文书
入党积极分子培养人意见
2015/06/02 职场文书
Nginx反爬虫策略,防止UA抓取网站
2021/03/31 Servers