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 相关文章推荐
IE与FireFox的兼容性问题分析
Apr 22 Javascript
ASP.NET jQuery 实例2 (表单中使用回车在TextBox之间向下移动)
Jan 13 Javascript
JQuery 返回布尔值Is()条件判断方法代码
May 14 Javascript
js获取select默认选中的Option并不是当前选中值
May 07 Javascript
JavaScript各类型的关系图解
Oct 16 Javascript
Jqgrid之强大的表格插件应用
Dec 02 Javascript
JQuery实现文字无缝滚动效果示例代码(Marquee插件)
Mar 07 Javascript
分析JS中this引发的bug
Dec 12 Javascript
详解如何在Vue里建立长按指令
Aug 20 Javascript
微信小程序新手教程之页面打开数量限制
Mar 03 Javascript
解决vue v-for src 图片路径问题 404
Nov 12 Javascript
vue 项目软键盘回车触发搜索事件
Sep 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
ThinkPHP独立分组使用的注意事项
2014/11/25 PHP
js 点击按钮弹出另一页,选择值后,返回到当前页
2010/05/26 Javascript
JavaScript 参数中的数组展开 [译]
2012/09/21 Javascript
JavaScript创建类/对象的几种方式概述及实例
2013/05/06 Javascript
WEB前端设计师常用工具集锦
2014/12/09 Javascript
node.js中的url.parse方法使用说明
2014/12/10 Javascript
js如何实现点击标签文字,文字在文本框出现
2015/08/05 Javascript
JavaScript自定义文本框光标
2017/03/05 Javascript
Bootstrap如何激活导航状态
2017/03/22 Javascript
JS基于正则实现数字千分位用逗号分隔的方法
2017/06/16 Javascript
原生js FileReader对象实现图片上传本地预览效果
2020/03/27 Javascript
Bootstrap modal只加载一次数据的解决办法(推荐)
2017/11/24 Javascript
vue data有值,但是页面{{}} 取不到值的解决
2020/11/09 Javascript
实例讲解Python设计模式编程之工厂方法模式的使用
2016/03/02 Python
python中string模块各属性以及函数的用法介绍
2016/05/30 Python
python机器学习案例教程——K最近邻算法的实现
2017/12/28 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
pygame实现飞机大战
2020/03/11 Python
pycharm安装及如何导入numpy
2020/04/03 Python
Python如何在循环内使用list.remove()
2020/06/01 Python
Python中pass的作用与使用教程
2020/11/13 Python
CSS3 制作旋转的大风车(充满童年回忆)
2013/01/30 HTML / CSS
html5 postMessage解决跨域、跨窗口消息传递方案
2016/12/20 HTML / CSS
美国运动鞋类和服装零售连锁店:Shoe Palace
2019/08/13 全球购物
建筑设计学生的自我评价
2014/01/16 职场文书
创建精神文明单位实施方案
2014/03/08 职场文书
幼儿园师德师风学习材料
2014/05/29 职场文书
协会周年庆活动方案
2014/08/26 职场文书
学习三严三实对照检查材料思想汇报
2014/09/22 职场文书
2014年党建工作汇报材料
2014/11/02 职场文书
业务员工作态度散漫检讨书
2014/11/02 职场文书
坎儿井导游词
2015/02/09 职场文书
2015年银行工作总结范文
2015/04/01 职场文书
王亚平太空授课观后感
2015/06/12 职场文书
法定代表人身份证明书
2015/06/18 职场文书
优质服务标语口号
2015/12/26 职场文书