<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        Nodejs中crypto模塊的安全知識講解

        來源:懂視網 責編:小采 時間:2020-11-27 22:22:23
        文檔

        Nodejs中crypto模塊的安全知識講解

        Nodejs中crypto模塊的安全知識講解:互聯網時代,網絡上的數據量每天都在以驚人的速度增長。同時,各類網絡安全問題層出不窮。在信息安全重要性日益凸顯的今天,作為一名開發者,需要加強對安全的認識,并通過技術手段增強服務的安全性。 crypto模塊是nodejs的核心模塊之一,它提供了安全相關的
        推薦度:
        導讀Nodejs中crypto模塊的安全知識講解:互聯網時代,網絡上的數據量每天都在以驚人的速度增長。同時,各類網絡安全問題層出不窮。在信息安全重要性日益凸顯的今天,作為一名開發者,需要加強對安全的認識,并通過技術手段增強服務的安全性。 crypto模塊是nodejs的核心模塊之一,它提供了安全相關的

        互聯網時代,網絡上的數據量每天都在以驚人的速度增長。同時,各類網絡安全問題層出不窮。在信息安全重要性日益凸顯的今天,作為一名開發者,需要加強對安全的認識,并通過技術手段增強服務的安全性。

        crypto模塊是nodejs的核心模塊之一,它提供了安全相關的功能,如摘要運算、加密、電子簽名等。很多初學者對著長長的API列表,不知如何上手,因此它背后涉及了大量安全領域的知識。

        本文重點講解API背后的理論知識,主要包括如下內容:

        摘要(hash)、基于摘要的消息驗證碼(HMAC)

        對稱加密、非對稱加密、電子簽名

        分組加密模式

        摘要(hash)

        摘要(digest):將長度不固定的消息作為輸入,通過運行hash函數,生成固定長度的輸出,這段輸出就叫做摘要。通常用來驗證消息完整、未被篡改。

        摘要運算是不可逆的。也就是說,輸入固定的情況下,產生固定的輸出。但知道輸出的情況下,無法反推出輸入。

        偽代碼如下。

        digest = Hash(message)

        常見的摘要算法 與 對應的輸出位數如下:

        MD5:128位

        SHA-1:160位

        SHA256 :256位

        SHA512:512位

        nodejs中的例子:

        var crypto = require('crypto');
        var md5 = crypto.createHash('md5');
        var message = 'hello';
        var digest = md5.update(message, 'utf8').digest('hex'); 
        console.log(digest);
        // 
        輸出如下:注意這里是16進制 // 5d41402abc4b2a76b9719d911017c592

        備注:在各類文章或文獻中,摘要、hash、散列 這幾個詞經常會混用,導致不少初學者看了一臉懵逼,其實大部分時候指的都是一回事,記住上面對摘要的定義就好了。

        MAC、HMAC

        MAC(Message Authentication Code):消息認證碼,用以保證數據的完整性。運算結果取決于消息本身、秘鑰。

        MAC可以有多種不同的實現方式,比如HMAC。

        HMAC(Hash-based Message Authentication Code):可以粗略地理解為帶秘鑰的hash函數。

        nodejs例子如下:

        const crypto = require('crypto');
        // 參數一:摘要函數
        // 參數二:秘鑰
        let hmac = crypto.createHmac('md5', '123456');
        let ret = hmac.update('hello').digest('hex');
        console.log(ret);
        // 9c699d7af73a49247a239cb0dd2f8139

        對稱加密、非對稱加密

        加密/解密:給定明文,通過一定的算法,產生加密后的密文,這個過程叫加密。反過來就是解密。

        encryptedText = encrypt( plainText )
        plainText = decrypt( encryptedText )

        秘鑰:為了進一步增強加/解密算法的安全性,在加/解密的過程中引入了秘鑰。秘鑰可以視為加/解密算法的參數,在已知密文的情況下,如果不知道解密所用的秘鑰,則無法將密文解開。

        encryptedText = encrypt(plainText, encryptKey)
        plainText = decrypt(encryptedText, decryptKey)

        根據加密、解密所用的秘鑰是否相同,可以將加密算法分為對稱加密、非對稱加密。

        1、對稱加密

        加密、解密所用的秘鑰是相同的,即encryptKey === decryptKey。

        常見的對稱加密算法:DES、3DES、AES、Blowfish、RC5、IDEA。

        加、解密偽代碼:

        encryptedText = encrypt(plainText, key); // 加密
        plainText = decrypt(encryptedText, key); // 解密

        2、非對稱加密

        又稱公開秘鑰加密。加密、解密所用的秘鑰是不同的,即encryptKey !== decryptKey。

        加密秘鑰公開,稱為公鑰。解密秘鑰保密,稱為秘鑰。

        常見的非對稱加密算法:RSA、DSA、ElGamal。

        加、解密偽代碼:

        encryptedText = encrypt(plainText, publicKey); // 加密
        plainText = decrypt(encryptedText, priviteKey); // 解密

        3、對比與應用

        除了秘鑰的差異,還有運算速度上的差異。通常來說:

        對稱加密速度要快于非對稱加密。

        非對稱加密通常用于加密短文本,對稱加密通常用于加密長文本。

        兩者可以結合起來使用,比如HTTPS協議,可以在握手階段,通過RSA來交換生成對稱秘鑰。在之后的通訊階段,可以使用對稱加密算法對數據進行加密,秘鑰則是握手階段生成的。

        備注:對稱秘鑰交換不一定通過RSA,還可以通過類似DH來完成,這里不展開。

        數字簽名

        從簽名大致可以猜到數字簽名的用途。主要作用如下:

        確認信息來源于特定的主體。

        確認信息完整、未被篡改。

        為了達到上述目的,需要有兩個過程:

        發送方:生成簽名。

        接收方:驗證簽名。

        1、發送方生成簽名

        計算原始信息的摘要。

        通過私鑰對摘要進行簽名,得到電子簽名。

        將原始信息、電子簽名,發送給接收方。

        附:簽名偽代碼

        digest = hash(message); // 計算摘要
        digitalSignature = sign(digest, priviteKey); // 計算數字簽名

        2、接收方驗證簽名

        通過公鑰解開電子簽名,得到摘要D1。(如果解不開,信息來源主體校驗失?。?br />

        計算原始信息的摘要D2。

        對比D1、D2,如果D1等于D2,說明原始信息完整、未被篡改。

        附:簽名驗證偽代碼

        digest1 = verify(digitalSignature, publicKey); // 獲取摘要
        digest2 = hash(message); // 計算原始信息的摘要
        digest1 === digest2 // 驗證是否相等

        3、對比非對稱加密

        由于RSA算法的特殊性,加密/解密、簽名/驗證 看上去特別像,很多同學都很容易混淆。先記住下面結論,后面有時間再詳細介紹。

        加密/解密:公鑰加密,私鑰解密。

        簽名/驗證:私鑰簽名,公鑰驗證。

        分組加密模式、填充、初始化向量

        常見的對稱加密算法,如AES、DES都采用了分組加密模式。這其中,有三個關鍵的概念需要掌握:模式、填充、初始化向量。

        搞清楚這三點,才會知道crypto模塊對稱加密API的參數代表什么含義,出了錯知道如何去排查。

        1、分組加密模式

        所謂的分組加密,就是將(較長的)明文拆分成固定長度的塊,然后對拆分的塊按照特定的模式進行加密。

        常見的分組加密模式有:ECB(不安全)、CBC(最常用)、CFB、OFB、CTR等。

        以最簡單的ECB為例,先將消息拆分成等分的模塊,然后利用秘鑰進行加密。

        后面假設每個塊的長度為128位

        2、初始化向量:IV

        為了增強算法的安全性,部分分組加密模式(CFB、OFB、CTR)中引入了初始化向量(IV),使得加密的結果隨機化。也就是說,對于同一段明文,IV不同,加密的結果不同。

        以CBC為例,每一個數據塊,都與前一個加密塊進行亦或運算后,再進行加密。對于第一個數據塊,則是與IV進行亦或。

        IV的大小跟數據塊的大小有關(128位),跟秘鑰的長度無關。

        3、填充:padding

        分組加密模式需要對長度固定的塊進行加密。分組拆分完后,最后一個數據塊長度可能小于128位,此時需要進行填充以滿足長度要求。

        填充方式有多重。常見的填充方式有PKCS7。

        假設分組長度為k字節,最后一個分組長度為k-last,可以看到:

        不管明文長度是多少,加密之前都會會對明文進行填充 (不然解密函數無法區分最后一個分組是否被填充了,因為存在最后一個分組長度剛好等于k的情況)

        如果最后一個分組長度等于k-last === k,那么填充內容為一個完整的分組 k k k ... k (k個字節)

        如果最后一個分組長度小于k-last < k,那么填充內容為 k-last mod k

        01 -- if lth mod k = k-1
        02 02 -- if lth mod k = k-2
        .
        .
        .
        k k ... k k -- if lth mod k = 0

        概括來說

        分組加密:先將明文切分成固定長度的塊(128位),再進行加密。

        分組加密的幾種模式:ECB(不安全)、CBC(最常用)、CFB、OFB、CTR。

        填充(padding):部分加密模式,當最后一個塊的長度小于128位時,需要通過特定的方式進行填充。(ECB、CBC需要填充,CFB、OFB、CTR不需要填充)

        初始化向量(IV):部分加密模式(CFB、OFB、CTR)會將 明文塊 與 前一個密文塊進行亦或操作。對于第一個明文塊,不存在前一個密文塊,因此需要提供初始化向量IV(把IV當做第一個明文塊 之前的 密文塊)。此外,IV也可以讓加密結果隨機化。

        寫在后面

        crypto模塊涉及的安全知識較多,篇幅所限,這里沒辦法一一展開。為了講解方便,部分內容可能不夠嚴謹,如有錯漏敬請指出。

        如果大家在學習的時候還有其他疑問可以在下方的留言區域討論,感謝你對腳本之家的支持。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        Nodejs中crypto模塊的安全知識講解

        Nodejs中crypto模塊的安全知識講解:互聯網時代,網絡上的數據量每天都在以驚人的速度增長。同時,各類網絡安全問題層出不窮。在信息安全重要性日益凸顯的今天,作為一名開發者,需要加強對安全的認識,并通過技術手段增強服務的安全性。 crypto模塊是nodejs的核心模塊之一,它提供了安全相關的
        推薦度:
        標簽: 安全 知識 的安全
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲成a人片在线观看久| 亚洲人成片在线观看| 亚洲精品国偷自产在线| 亚洲国产成人资源在线软件 | 亚洲欧美综合精品成人导航| 特级毛片aaaa免费观看| 亚洲一区二区三区免费视频| 国产亚洲色视频在线| 亚洲AV综合色区无码一二三区| 51在线视频免费观看视频| 国产亚洲精品自在线观看| 2022免费国产精品福利在线| 国产成人精品免费视频软件| 亚洲a级在线观看| 95免费观看体验区视频| 亚洲va久久久噜噜噜久久狠狠| 日韩久久无码免费毛片软件| 日韩成人在线免费视频| 色噜噜亚洲男人的天堂| 久久精品无码专区免费青青| 亚洲免费黄色网址| 国产精品免费一级在线观看| 一个人免费观看视频在线中文| 夜色阁亚洲一区二区三区| 国产成人精品久久亚洲高清不卡 | 中文免费观看视频网站| 亚洲欧美日韩中文高清www777| 亚洲VA综合VA国产产VA中| 花蝴蝶免费视频在线观看高清版| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 亚洲福利视频一区二区三区| 国产精品免费观看调教网| 在线观看亚洲精品国产| 亚洲精品视频免费观看| 久久国产亚洲高清观看| 91精品国产免费久久国语蜜臀| 亚洲fuli在线观看| 中文字幕亚洲一区二区va在线| 18女人毛片水真多免费| 最好2018中文免费视频| 亚洲欧洲日产韩国在线|