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 18 Javascript
jquery.qrcode在线生成二维码使用示例
Aug 21 Javascript
使用jquery组件qrcode生成二维码及应用指南
Feb 22 Javascript
jQuery防止重复绑定事件的解决方法
May 14 Javascript
AngularJS 避繁就简的路由
Jul 01 Javascript
JavaScript中Array的实用操作技巧分享
Sep 11 Javascript
基于javascript实现按圆形排列DIV元素(二)
Dec 02 Javascript
jQuery图片轮播(二)利用构造函数和原型创建对象以实现继承
Dec 06 Javascript
js学习心得_一个简单的动画库封装tween.js
Jul 14 Javascript
浅谈react-router HashRouter和BrowserRouter的使用
Dec 29 Javascript
react native 文字轮播的实现示例
Jul 27 Javascript
vue template中slot-scope/scope的使用方法
Sep 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 配置后台登录以及模板引入
2017/01/24 PHP
PHP5.5新特性之yield理解与用法实例分析
2019/01/11 PHP
PDO::setAttribute讲解
2019/01/29 PHP
JavaScript 变量基础知识
2009/11/07 Javascript
Jquery获取元素的父容器对象示例代码
2014/02/10 Javascript
Javascript中使用parseInt函数需要注意的问题
2015/04/02 Javascript
JavaScript获取当前网页标题(title)的方法
2015/04/03 Javascript
JavaScript中利用各种循环进行遍历的方式总结
2015/11/10 Javascript
Javascript闭包与函数柯里化浅析
2016/06/22 Javascript
js中document.referrer实现移动端返回上一页
2017/02/22 Javascript
在 Linux/Unix 中不重启 Vim 而重新加载 .vimrc 文件的流程
2018/03/21 Javascript
JavaScript实现读取与输出XML文件数据的方法示例
2018/06/05 Javascript
javascript将非数值转换为数值
2018/09/13 Javascript
详细讲解如何创建, 发布自己的 Vue UI 组件库
2019/05/29 Javascript
jQuery提示框插件SweetAlert用法分析
2019/08/05 jQuery
基于jQuery拖拽事件的封装
2020/11/29 jQuery
python中学习K-Means和图片压缩
2017/11/20 Python
Python 反转字符串(reverse)的方法小结
2018/02/20 Python
Python日志模块logging基本用法分析
2018/08/23 Python
Python图像处理之简单画板实现方法示例
2018/08/30 Python
Python格式化输出字符串方法小结【%与format】
2018/10/29 Python
对python中的控制条件、循环和跳出详解
2019/06/24 Python
用Python实现最速下降法求极值的方法
2019/07/10 Python
cProfile Python性能分析工具使用详解
2019/07/22 Python
Python 复平面绘图实例
2019/11/21 Python
Python 音频生成器的实现示例
2019/12/24 Python
python @propert装饰器使用方法原理解析
2019/12/25 Python
win7上tensorflow2.2.0安装成功 引用DLL load failed时找不到指定模块 tensorflow has no attribute xxx 解决方法
2020/05/20 Python
8款使用 CSS3 实现超炫的 Loading(加载)的动画效果
2015/03/17 HTML / CSS
我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
2014/03/30 面试题
成品仓管员工作职责
2013/12/29 职场文书
长辈证婚人证婚词
2014/01/09 职场文书
养殖项目策划书范文
2014/01/13 职场文书
电信营业员自我评价分享
2014/01/17 职场文书
员工试用期自我鉴定范文
2014/09/15 职场文书
寒山寺导游词
2015/02/03 职场文书