最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

哈希值計(jì)算 crypto.Hash

哈希值計(jì)算通常是用來對數(shù)據(jù)完整性和正確性做一個(gè)校驗(yàn)?zāi)康氖褂?,?dāng)我們需要確保接受的數(shù)據(jù)是跟發(fā)送的數(shù)據(jù)一毛一樣的時(shí)候,就可以通過分別計(jì)算發(fā)送數(shù)據(jù)的哈希值和接收到數(shù)據(jù)的哈希值。做一個(gè)簡單的比較就能判斷出來,兩個(gè)一樣的數(shù)據(jù)得到的哈希值肯定是一樣的。哈希值不能逆向計(jì)算還原成原來的數(shù)據(jù),所以只能用來驗(yàn)證數(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官方演示代碼,我選擇了其中最簡單的使用方式,這種使用方式也是我們最常使用的,那就是對一個(gè)字符串或者一組數(shù)據(jù)進(jìn)行哈希值計(jì)算。crypto.Hash實(shí)現(xiàn)的哈希算法是使用固定的秘語Secret作為計(jì)算的算子,Node.js中還有一個(gè)與其類似的,但是可以改變秘語Secret的加密類crypto.Hmac。

可變哈希計(jì)算 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很相似,唯一不同點(diǎn)就是多了一個(gè)可以自定義的秘語Secret,使用定制的秘語Secret的一個(gè)用途就是保存密碼的時(shí)候可以提高安全性,畢竟使用默認(rèn)秘語Secret的哈希算法函數(shù),只要知道使用了什么算法就能通過暴力碰撞獲取到密碼,但是使用了定制秘語Secret的哈希函數(shù),就算是使用窮舉法也幾乎是不可能破解的。

對稱加密與解密

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

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

對稱加密使用過程

加密示例代碼

 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

讓我們一步一步的來解釋這個(gè)代碼吧。

const algorithm = 'aes-192-cbc';

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

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

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

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

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

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

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

這兩行就很簡單了,就是對輸入的字符串進(jìn)行加密計(jì)算,update(...,'utf8', 'hex')中utf8是加密前字符串的編碼格式,hex是加密后輸出的編碼格式。最后需要在加密后的字符串后面添加一個(gè)結(jié)束字符,這個(gè)工作由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);

// 上面是加密部分
// 因?yàn)榧用芎徒饷艿拿荑€和初始向量要一致
// 所以就把加密和解密合并書寫

// 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

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

結(jié)語

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

相關(guān)文章

最新評論

合水县| 普兰县| 周宁县| 吴堡县| 昭平县| 唐海县| 林甸县| 策勒县| 巨野县| 屯留县| 忻州市| 禄丰县| 舟曲县| 桃源县| 绥化市| 饶阳县| 富民县| 柘荣县| 安乡县| 彰武县| 会泽县| 龙游县| 永兴县| 宣化县| 南郑县| 抚顺市| 永嘉县| 迭部县| 阳泉市| 泰州市| 昭觉县| 荥阳市| 桂东县| 武宣县| 高清| 方山县| 龙江县| 鄱阳县| 漯河市| 景德镇市| 甘泉县|