0x0 前言
先要知道,什么是散列算法呢?產生一些數據片段(例如消息或會話項)的散列值的算法。例如,md5就是一種散列算法。軟件開發中的散列函數或散列算法,又稱哈希函數,英語:Hash Function,是一種從任何一種數據中創建小的數字“指紋”的方法。所有散列函數都有如下一個基本特性:如果兩個散列值是不相同的(根據同一函數),那么這兩個散列值的原始輸入也是不相同的。
加 密算法通常分為對稱性加密算法和非對稱性加密算法,對于對稱性加密算法,信息接收雙方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是對數據進行 加解密了。非對稱算法與之不同,發送雙方A,B事先均生成一堆密匙,然后A將自己的公有密匙發送給B,B將自己的公有密匙發送給A,如果A要給B發送消 息,則先需要用B的公有密匙進行消息加密,然后發送給B端,此時B端再用自己的私有密匙進行消息解密,B向A發送消息時為同樣的道理。
散列和加密本質上都是將一個Object變成一串無意義的字符串,不同點是經過散列的對象無法復原,是一個單向的過程。例如,對密碼的加密通常就是使用散列算法,因此用戶如果忘記密碼只能通過修改而無法獲取原始密碼。但是對于信息的加密則是正規的加密算法,經過加密的信息是可以通過秘鑰解密和還原。
散列與加密
散列是給鍵值經過數學算法轉換另外一個鍵值,在轉換過程中是利用哈希函數生成,輸出的內容無法還原,這邊主要用于密碼存儲在數據需要進行散列處理。
加密是對信息編碼,將原始信息轉換成密文,一般用于客戶端向服務器發送密碼等敏感信息,發送之前對此信息加密,然后在服務器再進行解密。
0x1 散列
Node.js 生態有很多依賴,例如Bcrypt 和 Argon2 ,本身使用起來很簡單,這次使用 Bcrypt 來實現散列過程:
1
2
|
yarn add bcrypt yarn add @types /bcrypt -D |
然后對散列的業務進行封裝:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
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 加密方式對數據進行加密:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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() ]) |
如果需要解密也很簡單:
1
2
3
4
5
6
7
|
import { createDecipheriv } from 'crypto' const decipher = createDecipheriv( 'aes-256-ctr' , key, iv) const decryptedText = Buffer.concat([ decipher.update(encryptedText), decipher.final() ]) |
0x3 參考
總結
到此這篇關于Nest.js散列與加密的文章就介紹到這了,更多相關Nest.js散列與加密內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://iiong.com/nest-js-hashing-and-encryption/