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

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

 更新時(shí)間:2021年05月10日 09:11:19   作者:aokihu  
這篇文章主要介紹了使用Nodejs內(nèi)置加密模塊實(shí)現(xiàn)對(duì)等加密與解密,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(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)簡(jiǎn)單的加密與解密功能,畢竟使用加密與解密的目的就是為了保證通訊的安全,而使用非官方的第三方庫總是有可能存在添加的后門或者什么的,而使用Node.js自帶的crypto模塊就能最大程度的保證加密的安全性。

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

哈希值計(jì)算通常是用來對(duì)數(shù)據(jù)完整性和正確性做一個(gè)校驗(yàn)?zāi)康氖褂?,?dāng)我們需要確保接受的數(shù)據(jù)是跟發(fā)送的數(shù)據(jù)一毛一樣的時(shí)候,就可以通過分別計(jì)算發(fā)送數(shù)據(jù)的哈希值和接收到數(shù)據(jù)的哈希值。做一個(gè)簡(jiǎn)單的比較就能判斷出來,兩個(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官方演示代碼,我選擇了其中最簡(jiǎn)單的使用方式,這種使用方式也是我們最常使用的,那就是對(duì)一個(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ù),就算是使用窮舉法也幾乎是不可能破解的。

對(duì)稱加密與解密

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

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

對(duì)稱加密使用過程

加密示例代碼

 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,第二部分是加密長(zhǎng)度192位,第三部分是加密認(rèn)證方法(這部分可能理解有誤)cbc

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

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

密鑰Key和初始向量Initialization vector這兩個(gè)關(guān)鍵參數(shù)的長(zhǎng)度沒有在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');

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

對(duì)稱解密過程

解密示例代碼

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ù)的長(zhǎng)度,還有一點(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)對(duì)等加密與解密的文章就介紹到這了,更多相關(guān)Nodejs對(duì)等加密與解密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 初識(shí)NodeJS服務(wù)端開發(fā)入門(Express+MySQL)

    初識(shí)NodeJS服務(wù)端開發(fā)入門(Express+MySQL)

    本篇文章主要介紹了初識(shí)NodeJS服務(wù)端開發(fā)入門(Express+MySQL),可以對(duì)數(shù)據(jù)庫中的一張表進(jìn)行簡(jiǎn)單的CRUD操作,有興趣的可以了解一下。
    2017-04-04
  • 淺談Node.js輕量級(jí)Web框架Express4.x使用指南

    淺談Node.js輕量級(jí)Web框架Express4.x使用指南

    本篇文章主要介紹了淺談Node.js輕量級(jí)Web框架Express4.x使用指南,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • nw.js實(shí)現(xiàn)類似微信的聊天軟件

    nw.js實(shí)現(xiàn)類似微信的聊天軟件

    本文給大家介紹的是使用nw.js實(shí)現(xiàn)類似微信的聊天軟件,還處于測(cè)試階段,功能非常少,大家一起來添磚加瓦吧。
    2015-03-03
  • 如何利用node轉(zhuǎn)發(fā)請(qǐng)求詳解

    如何利用node轉(zhuǎn)發(fā)請(qǐng)求詳解

    這篇文章主要給大家介紹了關(guān)于利用node轉(zhuǎn)發(fā)請(qǐng)求的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • koa-router路由參數(shù)和前端路由的結(jié)合詳解

    koa-router路由參數(shù)和前端路由的結(jié)合詳解

    這篇文章主要給大家介紹了關(guān)于koa-router路由參數(shù)和前端路由的結(jié)合的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用koa-router具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Node.js使用officecrypto-tool實(shí)現(xiàn)讀取加密的Excel和Word文檔

    Node.js使用officecrypto-tool實(shí)現(xiàn)讀取加密的Excel和Word文檔

    這篇文章主要為大家詳細(xì)介紹了Node.js如何使用officecrypto-tool實(shí)現(xiàn)讀取加密的Excel和Word文檔的功能,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-09-09
  • Node.js readline 逐行讀取、寫入文件內(nèi)容的示例

    Node.js readline 逐行讀取、寫入文件內(nèi)容的示例

    本篇文章主要介紹了Node.js readline逐行讀取、寫入文件內(nèi)容的示例,運(yùn)用readline逐行讀取的兩種實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • express的中間件bodyParser詳解

    express的中間件bodyParser詳解

    這篇文章主要介紹了node.js中express的中間件bodyParser的使用方法,需要的朋友可以參考下
    2014-12-12
  • 基于socket.io和node.js搭建即時(shí)通信系統(tǒng)

    基于socket.io和node.js搭建即時(shí)通信系統(tǒng)

    socket.IO是一個(gè)websocket庫,包括了客戶端的js和服務(wù)器端的nodejs。官方地址:http://socket.io
    2014-07-07
  • 在NodeJs中使用node-schedule增加定時(shí)器任務(wù)的方法

    在NodeJs中使用node-schedule增加定時(shí)器任務(wù)的方法

    這篇文章主要介紹了從零開始在NodeJs中使用node-schedule增加定時(shí)器任務(wù)的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06

最新評(píng)論