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 网页黑白效果实现代码(兼容IE/FF等)
Apr 23 Javascript
js截取函数(indexOf,join等)
Sep 01 Javascript
原生javascript获取元素样式属性值的方法
Dec 25 Javascript
JS实现不规则TAB选项卡效果代码
Sep 16 Javascript
探讨JavaScript语句的执行过程
Jan 28 Javascript
深入浅出ES6之let和const命令
Aug 25 Javascript
jquery拼接ajax 的json和字符串拼接的方法
Mar 11 Javascript
js实现鼠标拖动功能
Mar 20 Javascript
9种使用Chrome Firefox 自带调试工具调试javascript技巧
Dec 22 Javascript
vue.js实现格式化时间并每秒更新显示功能示例
Jul 07 Javascript
Vue中使用 setTimeout() setInterval()函数的问题
Sep 13 Javascript
vue ant design 封装弹窗表单的使用
Jun 01 Vue.js
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
codeigniter发送邮件并打印调试信息的方法
2015/03/21 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
2016/01/03 PHP
PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...
2016/02/14 PHP
laravel model模型定义实现开启自动管理时间created_at,updated_at
2019/10/17 PHP
js不完美解决click和dblclick事件冲突问题
2012/07/16 Javascript
Jquery 自定义动画概述及示例
2013/03/29 Javascript
JSON序列化与解析原生JS方法且IE6和chrome测试通过
2013/09/05 Javascript
js实现全屏漂浮广告移入光标停止移动
2013/12/02 Javascript
JQuery中extend使用介绍
2014/03/13 Javascript
jquery获取radio值(单选组radio)
2014/10/16 Javascript
javascript中去除数组重复元素的实现方法【实例】
2016/04/12 Javascript
AngularJS入门教程之AngularJS指令
2016/04/18 Javascript
Javascript操作表单实例讲解(下)
2016/06/20 Javascript
JS常见算法详解
2017/02/28 Javascript
Javascript实现数组中的元素上下移动
2017/04/28 Javascript
jQuery:unbind方法的使用详解
2017/08/14 jQuery
[01:52]DOTA2完美大师赛Vega战队趣味视频——kpii老师小课堂
2017/11/25 DOTA
[43:57]Liquid vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
2014/06/09 Python
python 时间戳与格式化时间的转化实现代码
2016/03/23 Python
使用pyecharts在jupyter notebook上绘图
2020/04/23 Python
Python字典实现简单的三级菜单(实例讲解)
2017/07/31 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
2018/04/23 Python
python中计算一个列表中连续相同的元素个数方法
2018/06/29 Python
Python File(文件) 方法整理
2019/02/18 Python
解决pycharm运行程序出现卡住scanning files to index索引的问题
2019/06/27 Python
python保存log日志,实现用log日志画图
2019/12/24 Python
pytorch查看torch.Tensor和model是否在CUDA上的实例
2020/01/03 Python
python 数据库查询返回list或tuple实例
2020/05/15 Python
Python timeit模块原理及使用方法
2020/10/10 Python
墨西哥购物网站:Elektra
2020/01/21 全球购物
简洁的英文求职信范文
2014/05/03 职场文书
投标保密承诺书
2014/05/19 职场文书
Go缓冲channel和非缓冲channel的区别说明
2021/04/25 Golang
vue+springboot实现登录验证码
2021/05/27 Vue.js
详解Laravel制作API接口
2021/05/31 PHP