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

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

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

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

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

哈希值計(jì)算通常是用來(lái)對(duì)數(shù)據(jù)完整性和正確性做一個(gè)校驗(yàn)?zāi)康氖褂茫?dāng)我們需要確保接受的數(shù)據(jù)是跟發(fā)送的數(shù)據(jù)一毛一樣的時(shí)候,就可以通過(guò)分別計(jì)算發(fā)送數(shù)據(jù)的哈希值和接收到數(shù)據(jù)的哈希值。做一個(gè)簡(jiǎn)單的比較就能判斷出來(lái),兩個(gè)一樣的數(shù)據(jù)得到的哈希值肯定是一樣的。哈希值不能逆向計(jì)算還原成原來(lái)的數(shù)據(jù),所以只能用來(lái)驗(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官方演示代碼,我選擇了其中最簡(jiǎn)單的使用方式,這種使用方式也是我們最常使用的,那就是對(duì)一個(gè)字符串或者一組數(shù)據(jù)進(jìn)行哈希值計(jì)算。crypto.Hash實(shí)現(xiàn)的哈希算法是使用固定的秘語(yǔ)Secret作為計(jì)算的算子,Node.js中還有一個(gè)與其類(lèi)似的,但是可以改變秘語(yǔ)Secret的加密類(lèi)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è)可以自定義的秘語(yǔ)Secret,使用定制的秘語(yǔ)Secret的一個(gè)用途就是保存密碼的時(shí)候可以提高安全性,畢竟使用默認(rèn)秘語(yǔ)Secret的哈希算法函數(shù),只要知道使用了什么算法就能通過(guò)暴力碰撞獲取到密碼,但是使用了定制秘語(yǔ)Secret的哈希函數(shù),就算是使用窮舉法也幾乎是不可能破解的。

對(duì)稱(chēng)加密與解密

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

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

對(duì)稱(chēng)加密使用過(guò)程

加密示例代碼

 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

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

const algorithm = 'aes-192-cbc';

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

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

這一行是生成密鑰Key,注意最后的數(shù)字24,這個(gè)是生成的密鑰Key長(zhǎng)度,最小是8,最大沒(méi)限制不過(guò)必須是8的倍數(shù)才行,密鑰Key的長(zhǎng)度是跟所用的加密算法相關(guān)的,因?yàn)槲臋n中沒(méi)有這部分信息,所以使用的時(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)鍵但是文檔中沒(méi)有說(shuō)明的地方,IV的長(zhǎng)度也很關(guān)鍵,目前只知道長(zhǎng)度必須是8的倍數(shù),而且長(zhǎng)度是跟所使用的算法位數(shù)是相關(guān)的,但是文檔中沒(méi)有地方明確說(shuō)明,所以使用的時(shí)候也只能是不斷嘗試。

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

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

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

對(duì)稱(chēng)解密過(guò)程

解密示例代碼

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)榧用芎徒饷艿拿荑€和初始向量要一致
// 所以就把加密和解密合并書(shū)寫(xiě)

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

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

結(jié)語(yǔ)

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

相關(guān)文章

最新評(píng)論

平远县| 邢台县| 杭锦旗| 宁国市| 禄劝| 天长市| 巫溪县| 星座| 综艺| 当雄县| 清原| 晋中市| 敖汉旗| 丁青县| 广安市| 益阳市| 万宁市| 平昌县| 武宣县| 大方县| 鱼台县| 汕尾市| 南皮县| 黎平县| 肇州县| 亚东县| 达州市| 印江| 益阳市| 尼勒克县| 涟源市| 固阳县| 孝昌县| 长白| 奉新县| 平利县| 武鸣县| 沙湾县| 丹江口市| 西安市| 吉林省|