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

node中的crypto模塊操作方法

 更新時間:2023年10月11日 09:18:14   作者:dralexsanderl  
加密操作可能很棘手,以至于付費的加密服務(wù)公司的存在只是為了確保在代碼庫中正確實現(xiàn)加密操作,本文給大家介紹node中的crypto模塊操作方法,感興趣的朋友跟隨小編一起看看吧

node中的crypto模塊指南

加密操作可能很棘手,以至于付費的加密服務(wù)公司的存在只是為了確保在代碼庫中正確實現(xiàn)加密操作。好消息是,只需學(xué)習(xí)一些知識,我們就可以使用 Node 的內(nèi)置加密模塊免費進行適當(dāng)?shù)募用堋?/p>

在本指南中,我們將探討如何使用 Node 的內(nèi)置加密模塊正確執(zhí)行(對稱)加密/解密操作,以保護應(yīng)用程序的數(shù)據(jù)。

首先,我們需要了解對稱加密的概念。

對稱加密

當(dāng)人們談?wù)?ldquo;加密”時,他們往往指的是對稱加密,這對于將文本加密為隨機字符串非常有用。與此相關(guān)的一個常見場景是對服務(wù)器上的用戶數(shù)據(jù)進行加密,以便將其“靜態(tài)加密”存儲在數(shù)據(jù)庫中。

通俗地說,對稱加密就是獲取要加密的文本(稱為明文),并使用帶有加密算法的密鑰來輸出加密文本(稱為密文)。該操作是可逆的,因此解密是我們可以使用與明文相同的密鑰。

看起來很容易吧?

但是當(dāng)真正需要實現(xiàn)對稱加密時,開發(fā)人員經(jīng)常會犯錯誤,因為有很多東西需要理解:

  • 編碼格式:數(shù)據(jù)可以通過多種方式進行編碼/解碼,例如base64、hex等。當(dāng)從一種格式轉(zhuǎn)換為另一種格式時,這些不同的表示方式常常使開發(fā)人員感到困惑。算法和配置:有許多加密算法需要考慮,例如aes-256-gcmaes-256-cbc,每種算法都有自己的要求。
  • 隨機性:加密過程中使用的密鑰應(yīng)隨機生成,以確保高熵。很多時候,開發(fā)人員認(rèn)為他們正在生成足夠隨機的密鑰,但事實并非如此。
  • 復(fù)雜性:Node.js 中的加密涉及幾個步驟,這些步驟對開發(fā)人員來說并不總是直觀的,而且有些概念一開始確實令人費解。以初始化向量(IV)的概念為例;剛接觸密碼學(xué)的開發(fā)人員經(jīng)常在加密過程中重復(fù)使用這些內(nèi)容,這是一個很大的禁忌。

無論如何,在本文中并不會討論上述細(xì)微差別,但更多地關(guān)注我們?nèi)绾瓮ㄟ^示例使用 Node.js 正確執(zhí)行加密。

解釋如何正確執(zhí)行加密的最佳方法是演示使用aes-256-gcm算法的正確實現(xiàn)。讓我們從加密開始。

加密

const crypto = require('crypto');
const encryptSymmetric = (key, plaintext) => {
  const iv = crypto.randomBytes(12).toString('base64');
  const cipher = crypto.createCipheriv(
    "aes-256-gcm", 
    Buffer.from(key, 'base64'), 
    Buffer.from(iv, 'base64')
  );
  let ciphertext = cipher.update(plaintext, 'utf8', 'base64');
  ciphertext += cipher.final('base64');
  const tag = cipher.getAuthTag()
  return { ciphertext, tag }
}
const plaintext = "encrypt me";
const key = crypto.randomBytes(32).toString('base64');
const { ciphertext, iv, tag } = encryptSymmetric(key, plaintext);

要執(zhí)行加密,我們需要兩項:

  • plaintext:要加密的文本。
  • key:256 位加密密鑰。

我們從加密中得到以下輸出:

  • ciphertext:加密文本。
  • iv:一個 96 位初始化向量,用于提供加密的初始狀態(tài),并允許在未來的加密操作中以不同iv重復(fù)使用相同key。tag:在加密過程中生成的一段數(shù)據(jù),用于幫助驗證加密文本在稍后的解密過程中沒有被篡改。

讓我們看一下代碼:

const plaintext = "encrypt me";
const key = crypto.randomBytes(32).toString('base64');

這里我們定義執(zhí)行加密所需的輸入變量。除了要加密的文本之外,生成隨機數(shù)以通過更高的熵key確保安全性也很重要;我更喜歡使用內(nèi)置crypto.randomBytes()來生成。我還將所有內(nèi)容轉(zhuǎn)換為base64格式,因為它在概念上易于存儲。

接下來我們來剖析一下加密函數(shù):

const encryptSymmetric = (key, plaintext) => {
  // 創(chuàng)建隨機初始化向量
  const iv = crypto.randomBytes(12).toString('base64');
  // 創(chuàng)建一個密碼對象
  const cipher = crypto.createCipheriv("aes-256-gcm", key, iv);
  // 使用明文更新 cipher 對象以進行加密
  let ciphertext = cipher.update(plaintext, 'utf8', 'base64');
  // 完成加密過程
  ciphertext += cipher.final('base64');
  // 檢索加密的身份驗證標(biāo)簽
  const tag = cipher.getAuthTag();
  return { ciphertext, iv, tag };
}

在這里,加密函數(shù)在使用aes-256-gcm(可以將其視為一種加密算法)算法、keyiv``crypto.createCipheriv初始化期間創(chuàng)建一個新的密碼。下一部分加載要加密的文本plaintext并執(zhí)行加密并檢索身份驗證標(biāo)記,可以使用該標(biāo)記來檢查ciphertext解密過程中文本未被篡改。

關(guān)于加密,我們應(yīng)該了解的最后一件事是如何處理數(shù)據(jù)。在加密用戶數(shù)據(jù)并靜態(tài)存儲它的情況下,需要將加密的數(shù)據(jù)ciphertextiv、 和tag存儲在數(shù)據(jù)庫中,并將密鑰安全地存儲在其他地方,例如服務(wù)器上的環(huán)境變量。當(dāng)我們想要檢索數(shù)據(jù)時,可以從數(shù)據(jù)庫中查詢并使用密鑰對其進行解密。

說到這里,讓我們深入解密。

解密

const decryptSymmetric = (key, ciphertext, iv, tag) => {
  const decipher = crypto.createDecipheriv(
    "aes-256-gcm", 
    Buffer.from(key, 'base64'),
    Buffer.from(iv, 'base64')
  );
  decipher.setAuthTag(Buffer.from(tag, 'base64'));
  let plaintext = decipher.update(ciphertext, 'base64', 'utf8');
  plaintext += decipher.final('utf8');
  return plaintext;
}
const plaintext = decryptSymmetric(key, ciphertext, iv, tag);

要執(zhí)行解密,我們需要四項:

  • key:用于加密原始文本的256位加密密鑰。
  • ciphertext:要解密的密文。
  • iv:加密期間使用的 96 位初始化向量。t
  • ag:加密時生成的標(biāo)簽。

我們從加密中得到以下輸出:

plaintext:我們加密的原始文本。

讓我們看一下解密函數(shù):

const decryptSymmetric = (key, ciphertext, iv, tag) => {
  // 創(chuàng)建一個解密對象
  const decipher = crypto.createDecipheriv(
    "aes-256-gcm", 
    Buffer.from(key, 'base64'),
    Buffer.from(iv, 'base64')
  );
  // 設(shè)置解密對象 decipher 的認(rèn)證標(biāo)簽
  decipher.setAuthTag(Buffer.from(tag, 'base64'));
  // 使用 Base64 編碼的密文更新解密對象
  let plaintext = decipher.update(ciphertext, 'base64', 'utf8');
  // 完成解密
  plaintext += decipher.final('utf8');
  return plaintext;
}

這里,解密函數(shù)在用aes-256-gcm算法進行crypto.createDecipheriv初始化時創(chuàng)建了一個解密對象,key、iv是之前創(chuàng)建的。接下來設(shè)置身份驗證標(biāo)簽,用于檢查是否被ciphertext篡改,最后我們執(zhí)行解密以獲得原始文本。

最后,我們的數(shù)據(jù)的安全程度取決于用于加密數(shù)據(jù)的密鑰。因此,強烈建議安全地存儲加密密鑰,并在應(yīng)用程序中將它們作為環(huán)境變量進行訪問。

到此這篇關(guān)于node中的crypto模塊指南的文章就介紹到這了,更多相關(guān)node crypto模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Nodejs 通過 fs.createWriteStream 保存文件

    詳解Nodejs 通過 fs.createWriteStream 保存文件

    本篇文章主要介紹了Nodejs 通過 fs.createWriteStream 保存文件,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • nodejs實現(xiàn)遍歷文件夾并統(tǒng)計文件大小

    nodejs實現(xiàn)遍歷文件夾并統(tǒng)計文件大小

    這篇文章主要介紹了nodejs實現(xiàn)遍歷文件夾并統(tǒng)計文件大小,下面使用nodejs的遍歷文件夾文件內(nèi)容,并且讀取所有的文件,并采取排序往大到小的順序進行輸出,需要的朋友可以參考下
    2015-05-05
  • 使用Node.js處理前端代碼文件的編碼問題

    使用Node.js處理前端代碼文件的編碼問題

    這篇文章主要介紹了使用Node.js處理前端代碼文件的編碼問題的方法,Node自帶的相關(guān)類庫處理編碼方面的問題時還是比較得心應(yīng)手的,需要的朋友可以參考下
    2016-02-02
  • 詳解如何實現(xiàn)一個簡單的Node.js腳手架

    詳解如何實現(xiàn)一個簡單的Node.js腳手架

    本篇文章主要介紹了如何實現(xiàn)一個簡單的Node.js腳手架,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • Node.js中的CommonJS模塊化規(guī)范詳解

    Node.js中的CommonJS模塊化規(guī)范詳解

    這篇文章主要介紹了Node.js中的CommonJS模塊化規(guī)范,本文主要介紹了?CommonJS?規(guī)范在?Node?中的簡單應(yīng)用,主要就是導(dǎo)入和導(dǎo)出模塊,需要的朋友可以參考下
    2023-02-02
  • node.js插件nodeclipse安裝圖文教程

    node.js插件nodeclipse安裝圖文教程

    這篇文章主要為大家分享了node.js插件nodeclipse安裝圖文教程,如何安裝node.js支持插件,下面小編為大家分享具體步驟
    2016-05-05
  • 使用Node.js實現(xiàn)獲取視頻詳情

    使用Node.js實現(xiàn)獲取視頻詳情

    這篇文章主要為大家詳細(xì)介紹了如何在Node.js應(yīng)用程序中實現(xiàn)獲取視頻詳情的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • autojs的nodejs打包成品app經(jīng)驗分享

    autojs的nodejs打包成品app經(jīng)驗分享

    這篇文章主要為大家介紹了autojs的nodejs打包成品app經(jīng)驗分享,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • node.js中的console.trace方法使用說明

    node.js中的console.trace方法使用說明

    這篇文章主要介紹了node.js中的console.trace方法使用說明,本文介紹了console.trace的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 利用nodeJs anywhere搭建本地服務(wù)器環(huán)境的方法

    利用nodeJs anywhere搭建本地服務(wù)器環(huán)境的方法

    今天小編就為大家分享一篇利用nodeJs anywhere搭建本地服務(wù)器環(huán)境的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05

最新評論

南郑县| 田东县| 康乐县| 中江县| 龙游县| 定州市| 洛浦县| 宜兰市| 顺义区| 乐至县| 沾益县| 夹江县| 平湖市| 灵武市| 平利县| 库车县| 阳春市| 中山市| 大港区| 东安县| 红桥区| 安远县| 山丹县| 新巴尔虎右旗| 曲麻莱县| 宜君县| 宜昌市| 宣恩县| 沙雅县| 青冈县| 张家界市| 娄底市| 若尔盖县| 呼玛县| 齐齐哈尔市| 秦安县| 娄底市| 镇康县| 久治县| 商河县| 渑池县|