Nest.js散列与加密实例详解
0x0前言
先要知道,什么是散列算法呢?产生一些数据片段(例如消息或会话项)的散列值的算法。例如,md5就是一种散列算法。软件开发中的散列函数或散列算法,又称哈希函数,英语:HashFunction,是一种从任何一种数据中创建小的数字“指纹”的方法。所有散列函数都有如下一个基本特性:如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。
加密算法通常分为对称性加密算法和非对称性加密算法,对于对称性加密算法,信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行加解密了。非对称算法与之不同,发送双方A,B事先均生成一堆密匙,然后A将自己的公有密匙发送给B,B将自己的公有密匙发送给A,如果A要给B发送消息,则先需要用B的公有密匙进行消息加密,然后发送给B端,此时B端再用自己的私有密匙进行消息解密,B向A发送消息时为同样的道理。
散列和加密本质上都是将一个Object变成一串无意义的字符串,不同点是经过散列的对象无法复原,是一个单向的过程。例如,对密码的加密通常就是使用散列算法,因此用户如果忘记密码只能通过修改而无法获取原始密码。但是对于信息的加密则是正规的加密算法,经过加密的信息是可以通过秘钥解密和还原。
散列与加密
散列是给键值经过数学算法转换另外一个键值,在转换过程中是利用哈希函数生成,输出的内容无法还原,这边主要用于密码存储在数据需要进行散列处理。
加密是对信息编码,将原始信息转换成密文,一般用于客户端向服务器发送密码等敏感信息,发送之前对此信息加密,然后在服务器再进行解密。
0x1散列
Node.js生态有很多依赖,例如Bcrypt和Argon2,本身使用起来很简单,这次使用Bcrypt来实现散列过程:
yarnaddbcrypt yarnadd@types/bcrypt-D
然后对散列的业务进行封装:
import{Injectable}from'@nestjs/common' import*asbcryptfrom'bcrypt' @Injectable() exportclassBcryptService{ privatestaticreadonlySALT_ROUNDS:number=10 /** *对比检查密码 *@paramrawStr *@paramhashedStr */ asynccompare(rawStr:string,hashedStr:string){ returnbcrypt.compare(rawStr,hashedStr) } /** *生成hash *@paramrawStr *@paramsalt */ asynchash(rawStr:string,salt?:string){ returnbcrypt.hash(rawStr,salt||BcryptService.SALT_ROUNDS) } /** *生成盐 */ asyncgenSalt(){ returnbcrypt.genSalt(BcryptService.SALT_ROUNDS) } }
0x2加密
Node.js系统内自带加密模块,可用于加密和解密等相关操作,下面进行使用AES-256-CTR加密方式对数据进行加密:
import{createCipheriv,randomBytes}from'crypto' import{promisify}from'util' constiv=randomBytes(16) constpassword='Passwordusedtogeneratekey' //密钥长度取决于算法 //在aes256情况下是32个字节长度 constkey=(awaitpromisify(scrypt)(password,'salt',32))asBuffer constcipher=createCipheriv('aes-256-ctr',key,iv) consttextToEncrypt='Nest' constencryptedText=Buffer.concat([ cipher.update(textToEncrypt), cipher.final() ])
如果需要解密也很简单:
import{createDecipheriv}from'crypto' constdecipher=createDecipheriv('aes-256-ctr',key,iv) constdecryptedText=Buffer.concat([ decipher.update(encryptedText), decipher.final() ])
0x3参考
EncryptionandHashing
Node.jscrypto
node.bcrypt.js
总结
到此这篇关于Nest.js散列与加密的文章就介绍到这了,更多相关Nest.js散列与加密内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。