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 相关文章推荐
Javascript表达式中连续的 && 和 || 之赋值区别
Oct 17 Javascript
js实现的复制兼容chrome和IE
Apr 03 Javascript
使用typeof判断function是否存在于上下文
Aug 14 Javascript
JavaScript的null和undefined区别示例介绍
Sep 15 Javascript
js生成的验证码的实现与技术分析
Sep 17 Javascript
JS常用加密编码与算法实例总结
Dec 22 Javascript
JS对象与json字符串相互转换实现方法示例
Jun 14 Javascript
简述vue路由打开一个新的窗口的方法
Nov 29 Javascript
vue 地图可视化 maptalks 篇实例代码详解
May 21 Javascript
layui 数据表格 点击分页按钮 监听事件的实例
Sep 02 Javascript
Typescript的三种运行方式(小结)
Sep 18 Javascript
详解TS数字分隔符和更严格的类属性检查
May 06 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学习之 循环结构实现代码
2011/06/09 PHP
PHP基本语法总结
2014/09/06 PHP
thinkphp实现上一篇与下一篇的方法
2014/12/08 PHP
php数字运算验证码的实现代码
2015/07/30 PHP
分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件
2015/08/23 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
IE中直接运行显示当前网页中的图片 推荐
2006/08/31 Javascript
获取Javscript执行函数名称的方法
2006/12/22 Javascript
jQuery 动画弹出窗体支持多种展现方式
2010/04/29 Javascript
关于js中window.location.href,location.href,parent.location.href,top.location.href的用法与区别
2010/10/18 Javascript
node.js中的Socket.IO使用实例
2014/11/04 Javascript
javascript的日期对象、数组对象、二维数组使用说明
2014/12/22 Javascript
JavaScript的instanceof运算符学习教程
2016/06/08 Javascript
vue.js入门教程之绑定class和style样式
2016/09/02 Javascript
node.js中express-session配置项详解
2017/05/31 Javascript
详解微信小程序Page中data数据操作和函数调用
2017/09/27 Javascript
vue打包后显示空白正确处理方法
2017/11/01 Javascript
axios向后台传递数组作为参数的方法
2018/08/11 Javascript
vue路由切换之淡入淡出的简单实现
2019/10/31 Javascript
详谈Vue.js框架下main.js,App.vue,page/index.vue之间的区别
2020/08/12 Javascript
基于ajax实现上传图片代码示例解析
2020/12/03 Javascript
[01:12:53]完美世界DOTA2联赛PWL S2 Forest vs SZ 第一场 11.25
2020/11/26 DOTA
Python中查看文件名和文件路径
2017/03/31 Python
PyQt5每天必学之日历控件QCalendarWidget
2018/04/19 Python
如何优雅地处理Django中的favicon.ico图标详解
2018/07/05 Python
图文详解Django使用Pycharm连接MySQL数据库
2019/08/09 Python
Python实现把多维数组展开成DataFrame
2019/11/30 Python
Python基础之高级变量类型实例详解
2020/01/03 Python
后端开发使用pycharm的技巧(推荐)
2020/03/27 Python
CSS3制作日历实现代码
2012/01/21 HTML / CSS
移动端Html5页面生成图片解决方案
2018/08/07 HTML / CSS
初婚初育证明
2014/01/14 职场文书
优秀员工推荐信
2014/05/10 职场文书
医院合作意向书范本
2015/05/08 职场文书
导游词之泉州崇武古城
2019/12/20 职场文书
 分享一个Python 遇到数据库超好用的模块
2022/04/06 Python