欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解使用Nodejs內(nèi)置加密模塊實現(xiàn)對等加密與解密

 更新時間:2021年05月10日 09:11:19   作者:aokihu  
這篇文章主要介紹了使用Nodejs內(nèi)置加密模塊實現(xiàn)對等加密與解密,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

加密與解密是保證通訊安全的一種重要手段,現(xiàn)在加密算法已經(jīng)有很多,并且都有成熟的軟件包可以使用,這就大大降低了應用開發(fā)程序員的負擔,只需要使用這些第三方提供的加密解密庫就可以使用了,在Node.js中其實提供了一個非常強大而且方便的加密與解密模塊crypto,我們不需要使用第三方的NPM庫就能實現(xiàn)簡單的加密與解密功能,畢竟使用加密與解密的目的就是為了保證通訊的安全,而使用非官方的第三方庫總是有可能存在添加的后門或者什么的,而使用Node.js自帶的crypto模塊就能最大程度的保證加密的安全性。

哈希值計算 crypto.Hash

哈希值計算通常是用來對數(shù)據(jù)完整性和正確性做一個校驗目的使用,當我們需要確保接受的數(shù)據(jù)是跟發(fā)送的數(shù)據(jù)一毛一樣的時候,就可以通過分別計算發(fā)送數(shù)據(jù)的哈希值和接收到數(shù)據(jù)的哈希值。做一個簡單的比較就能判斷出來,兩個一樣的數(shù)據(jù)得到的哈希值肯定是一樣的。哈希值不能逆向計算還原成原來的數(shù)據(jù),所以只能用來驗證數(shù)據(jù)。那么在Node.js中該如何使用呢?

示例代碼

const crypto = require('crypto');
const hash = crypto.createHash('sha256');

hash.update('some data to hash');
console.log(hash.digest('hex'));
// Prints:
//   6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50

上面的代碼是抄錄自Node.js官方演示代碼,我選擇了其中最簡單的使用方式,這種使用方式也是我們最常使用的,那就是對一個字符串或者一組數(shù)據(jù)進行哈希值計算。crypto.Hash實現(xiàn)的哈希算法是使用固定的秘語Secret作為計算的算子,Node.js中還有一個與其類似的,但是可以改變秘語Secret的加密類crypto.Hmac。

可變哈希計算 crypto.Hmac

示例代碼

const crypto = require('crypto');
const hmac = crypto.createHmac('sha256', 'a secret');

hmac.update('some data to hash');
console.log(hmac.digest('hex'));
// Prints:
//   7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e

crypto.Hmac的使用方法與crypto.Hash很相似,唯一不同點就是多了一個可以自定義的秘語Secret,使用定制的秘語Secret的一個用途就是保存密碼的時候可以提高安全性,畢竟使用默認秘語Secret的哈希算法函數(shù),只要知道使用了什么算法就能通過暴力碰撞獲取到密碼,但是使用了定制秘語Secret的哈希函數(shù),就算是使用窮舉法也幾乎是不可能破解的。

對稱加密與解密

對稱加密與解密的意思是加密與解密雙方使用同一個秘語Secret實現(xiàn)加解密算法運算,這種加密算法不需要什么公鑰和私鑰,使用起來比較方便,而且與哈希算法不同,對稱加密解密是可以雙向互逆運算的。

Node.js中支持許多對稱加密算法,不過到底有哪些加密算法是取決于你計算機中安裝的OpenSSL決定的,Node.js只是去調(diào)用了OpenSSL。這就給我們帶來一個麻煩,那就是沒有辦法在文檔中查找加密算法信息,這個之后就會知道麻煩在哪里。

對稱加密使用過程

加密示例代碼

 const crypto = require('crypto');

 const algorithm = 'aes-192-cbc';
 const password = 'Password used to generate key';
// Use the async `crypto.scrypt()` instead.
 const key = crypto.scryptSync(password, 'salt', 24);
// Use `crypto.randomBytes` to generate a random iv instead of the static iv
// shown here.
 const iv = Buffer.alloc(16, 0); // Initialization vector.

 const cipher = crypto.createCipheriv(algorithm, key, iv);

 let encrypted = cipher.update('some clear text data', 'utf8', 'hex');
 encrypted += cipher.final('hex');
 console.log(encrypted);
// Prints: e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa

讓我們一步一步的來解釋這個代碼吧。

const algorithm = 'aes-192-cbc';

這一行是定義所使用的加密算法,通常有3個部分組成,中間用-連接,第一部分是加密算法名稱aes,第二部分是加密長度192位,第三部分是加密認證方法(這部分可能理解有誤)cbc

 const key = crypto.scryptSync(password, 'salt', 24);

這一行是生成密鑰Key,注意最后的數(shù)字24,這個是生成的密鑰Key長度,最小是8,最大沒限制不過必須是8的倍數(shù)才行,密鑰Key的長度是跟所用的加密算法相關(guān)的,因為文檔中沒有這部分信息,所以使用的時候只能不斷的嘗試,否則就會報錯!

 const iv = Buffer.alloc(16, 0); // Initialization vector.
 const cipher = crypto.createCipheriv(algorithm, key, iv);

第6行是創(chuàng)建初始向量Initialization vector,這也是一個非常關(guān)鍵但是文檔中沒有說明的地方,IV的長度也很關(guān)鍵,目前只知道長度必須是8的倍數(shù),而且長度是跟所使用的算法位數(shù)是相關(guān)的,但是文檔中沒有地方明確說明,所以使用的時候也只能是不斷嘗試。

密鑰Key和初始向量Initialization vector這兩個關(guān)鍵參數(shù)的長度沒有在Node.js文檔中寫明確是非常遺憾的,導致我們使用的時候要么去查加密算法相關(guān)資料,要么只能一個一個手動嘗試,非常的不方便。

 let encrypted = cipher.update('some clear text data', 'utf8', 'hex');
 encrypted += cipher.final('hex');

這兩行就很簡單了,就是對輸入的字符串進行加密計算,update(...,'utf8', 'hex')中utf8是加密前字符串的編碼格式,hex是加密后輸出的編碼格式。最后需要在加密后的字符串后面添加一個結(jié)束字符,這個工作由final('hex')完成,hex也是輸出的字符編碼格式。

對稱解密過程

解密示例代碼

const crypto = require('crypto');

const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// Use the async `crypto.scrypt()` instead.
const key = crypto.scryptSync(password, 'salt', 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.

const decipher = crypto.createDecipheriv(algorithm, key, iv);

// 上面是加密部分
// 因為加密和解密的密鑰和初始向量要一致
// 所以就把加密和解密合并書寫

// Encrypted using same algorithm, key and iv.
const encrypted =
  'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa';
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
decrypted += decipher.final('utf8');
console.log(decrypted);
// Prints: some clear text data

解密就是加密的逆過程,注意點也是一樣的,就是密鑰Key和初始向量Initialization vector這兩個參數(shù)的長度,還有一點要要注意的是decipher.update輸入的第一個參數(shù)只能是字符串,不能是Buffer類型,個人感覺用Buffer性能應該會更好點,可能以后會增加這個類型支持吧。

結(jié)語

到此這篇關(guān)于詳解使用Nodejs內(nèi)置加密模塊實現(xiàn)對等加密與解密的文章就介紹到這了,更多相關(guān)Nodejs對等加密與解密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論