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 相关文章推荐
js调试工具 Javascript Debug Toolkit 2.0.0版本发布
Dec 02 Javascript
javascript中的undefined 与 null 的区别  补充篇
Mar 17 Javascript
JavaScript 判断日期格式是否正确的实现代码
Jul 04 Javascript
Jquery 实现table样式的设定
Jan 28 Javascript
JS模仿编辑器实时改变文本框宽度和高度大小的方法
Aug 17 Javascript
AngularJs directive详解及示例代码
Sep 01 Javascript
BootStrap表单控件之文本域textarea
May 23 Javascript
ionic2屏幕适配实现适配手机、平板等设备的示例代码
Aug 11 Javascript
node.js 用socket实现聊天的示例代码
Oct 17 Javascript
CheckBox多选取值及判断CheckBox选中是否为空的实例
Oct 31 Javascript
Vue数据监听方法watch的使用
Mar 28 Javascript
uniapp微信小程序实现一个页面多个倒计时
Nov 01 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函数spl_autoload_register()用法和__autoload()介绍
2012/02/04 PHP
PHP中的正则表达式函数介绍
2012/02/27 PHP
确保Laravel网站不会被嵌入到其他站点中的方法
2019/10/18 PHP
jquery实现每个数字上都带进度条的幻灯片
2013/02/20 Javascript
D3.js 从P元素的创建开始(显示可加载数据)
2014/10/30 Javascript
jQuery实现鼠标划过修改样式的方法
2015/04/14 Javascript
jquery实现select选择框内容左右移动代码分享
2015/11/21 Javascript
JS中JSON对象和String之间的互转及处理技巧
2016/04/06 Javascript
JS读写CSS样式的方法汇总
2016/08/16 Javascript
聊一聊Vue.js过渡效果
2016/09/07 Javascript
AngularJs入门教程之环境搭建+创建应用示例
2016/11/01 Javascript
Angular 4.x 动态创建表单实例
2017/04/25 Javascript
Vue.js学习教程之列表渲染详解
2017/05/17 Javascript
利用HBuilder打包前端开发webapp为apk的方法
2017/11/13 Javascript
Vue封装Swiper实现图片轮播效果
2018/02/06 Javascript
vue地区选择组件教程详解
2018/05/04 Javascript
解决vue 中 echart 在子组件中只显示一次的问题
2018/08/07 Javascript
jQuery实现的简单拖拽功能示例【测试可用】
2018/08/14 jQuery
其实你可以少写点if else与switch(推荐)
2019/01/10 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
Vue如何获取数据列表展示
2019/12/11 Javascript
Python实现的数据结构与算法之链表详解
2015/04/22 Python
Python实现一个转存纯真IP数据库的脚本分享
2017/05/21 Python
用TensorFlow实现lasso回归和岭回归算法的示例
2018/05/02 Python
2020版Python学习路线图(附学习资料)
2020/09/15 Python
美国巧克力喷泉品牌:Sephra
2019/05/05 全球购物
全球高级音频和视频专家:HiDef Lifestyle
2019/08/02 全球购物
美国领先的机场停车聚合商:Airport Parking Reservations
2020/02/28 全球购物
捷克家电和家具购物网站:OKAY.cz
2020/07/23 全球购物
Weblogic的布署方式
2013/08/23 面试题
请写出 BOOL flag 与"零值"比较的 if 语句
2016/02/29 面试题
linux面试题参考答案(4)
2013/01/28 面试题
大学新生军训个人的自我评价
2013/10/03 职场文书
详解MySQL InnoDB存储引擎的内存管理
2021/04/08 MySQL
Python代码风格与编程习惯重要吗?
2021/06/03 Python
Centos7 Shell编程之正则表达式、文本处理工具详解
2022/08/05 Servers