最新文章專(zhuān)題視頻專(zhuān)題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專(zhuān)題1關(guān)鍵字專(zhuān)題50關(guān)鍵字專(zhuān)題500關(guān)鍵字專(zhuān)題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關(guān)鍵字專(zhuān)題關(guān)鍵字專(zhuān)題tag2tag3文章專(zhuān)題文章專(zhuān)題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專(zhuān)題3
問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

Nodejscrypto模塊中安全基礎(chǔ)知識(shí)分享

來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 20:07:40
文檔

Nodejscrypto模塊中安全基礎(chǔ)知識(shí)分享

Nodejscrypto模塊中安全基礎(chǔ)知識(shí)分享:本文主要和大家分享Nodejs進(jìn)階:crypto模塊中你需要掌握的安全基礎(chǔ)知識(shí),希望能幫助到大家?;ヂ?lián)網(wǎng)時(shí)代,網(wǎng)絡(luò)上的數(shù)據(jù)量每天都在以驚人的速度增長(zhǎng)。同時(shí),各類(lèi)網(wǎng)絡(luò)安全問(wèn)題層出不窮。在信息安全重要性日益凸顯的今天,作為一名開(kāi)發(fā)者,需要加強(qiáng)對(duì)安全的認(rèn)識(shí),
推薦度:
導(dǎo)讀Nodejscrypto模塊中安全基礎(chǔ)知識(shí)分享:本文主要和大家分享Nodejs進(jìn)階:crypto模塊中你需要掌握的安全基礎(chǔ)知識(shí),希望能幫助到大家。互聯(lián)網(wǎng)時(shí)代,網(wǎng)絡(luò)上的數(shù)據(jù)量每天都在以驚人的速度增長(zhǎng)。同時(shí),各類(lèi)網(wǎng)絡(luò)安全問(wèn)題層出不窮。在信息安全重要性日益凸顯的今天,作為一名開(kāi)發(fā)者,需要加強(qiáng)對(duì)安全的認(rèn)識(shí),

二、摘要(hash)

摘要(digest):將長(zhǎng)度不固定的消息作為輸入,通過(guò)運(yùn)行hash函數(shù),生成固定長(zhǎng)度的輸出,這段輸出就叫做摘要。通常用來(lái)驗(yàn)證消息完整、未被篡改。

摘要運(yùn)算是不可逆的。也就是說(shuō),輸入固定的情況下,產(chǎn)生固定的輸出。但知道輸出的情況下,無(wú)法反推出輸入。

偽代碼如下。

digest = Hash(message)

常見(jiàn)的摘要算法 與 對(duì)應(yīng)的輸出位數(shù)如下:

  • 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進(jìn)制 // 5d41402abc4b2a76b9719d911017c592備注:在各類(lèi)文章或文獻(xiàn)中,摘要、hash、散列 這幾個(gè)詞經(jīng)常會(huì)混用,導(dǎo)致不少初學(xué)者看了一臉懵逼,其實(shí)大部分時(shí)候指的都是一回事,記住上面對(duì)摘要的定義就好了。

    三、MAC、HMAC

    MAC(Message Authentication Code):消息認(rèn)證碼,用以保證數(shù)據(jù)的完整性。運(yùn)算結(jié)果取決于消息本身、秘鑰。

    MAC可以有多種不同的實(shí)現(xiàn)方式,比如HMAC。

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

    nodejs例子如下:

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

    四、對(duì)稱(chēng)加密、非對(duì)稱(chēng)加密

    加密/解密:給定明文,通過(guò)一定的算法,產(chǎn)生加密后的密文,這個(gè)過(guò)程叫加密。反過(guò)來(lái)就是解密。

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

    秘鑰:為了進(jìn)一步增強(qiáng)加/解密算法的安全性,在加/解密的過(guò)程中引入了秘鑰。秘鑰可以視為加/解密算法的參數(shù),在已知密文的情況下,如果不知道解密所用的秘鑰,則無(wú)法將密文解開(kāi)。

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

    根據(jù)加密、解密所用的秘鑰是否相同,可以將加密算法分為對(duì)稱(chēng)加密、非對(duì)稱(chēng)加密。

    1、對(duì)稱(chēng)加密

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

    常見(jiàn)的對(duì)稱(chēng)加密算法:DES、3DES、AES、Blowfish、RC5、IDEA。

    加、解密偽代碼:

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

    2、非對(duì)稱(chēng)加密

    又稱(chēng)公開(kāi)秘鑰加密。加密、解密所用的秘鑰是不同的,即encryptKey !== decryptKey。

    加密秘鑰公開(kāi),稱(chēng)為公鑰。解密秘鑰保密,稱(chēng)為秘鑰。

    常見(jiàn)的非對(duì)稱(chēng)加密算法:RSA、DSA、ElGamal。

    加、解密偽代碼:

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

    3、對(duì)比與應(yīng)用

    除了秘鑰的差異,還有運(yùn)算速度上的差異。通常來(lái)說(shuō):

    1. 對(duì)稱(chēng)加密速度要快于非對(duì)稱(chēng)加密。

    2. 非對(duì)稱(chēng)加密通常用于加密短文本,對(duì)稱(chēng)加密通常用于加密長(zhǎng)文本。

    兩者可以結(jié)合起來(lái)使用,比如HTTPS協(xié)議,可以在握手階段,通過(guò)RSA來(lái)交換生成對(duì)稱(chēng)秘鑰。在之后的通訊階段,可以使用對(duì)稱(chēng)加密算法對(duì)數(shù)據(jù)進(jìn)行加密,秘鑰則是握手階段生成的。

    備注:對(duì)稱(chēng)秘鑰交換不一定通過(guò)RSA,還可以通過(guò)類(lèi)似DH來(lái)完成,這里不展開(kāi)。

    五、數(shù)字簽名

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

    1. 確認(rèn)信息來(lái)源于特定的主體。

    2. 確認(rèn)信息完整、未被篡改。

    為了達(dá)到上述目的,需要有兩個(gè)過(guò)程:

    1. 發(fā)送方:生成簽名。

    2. 接收方:驗(yàn)證簽名。

    1、發(fā)送方生成簽名

    1. 計(jì)算原始信息的摘要。

    2. 通過(guò)私鑰對(duì)摘要進(jìn)行簽名,得到電子簽名。

    3. 將原始信息、電子簽名,發(fā)送給接收方。

    附:簽名偽代碼

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

    2、接收方驗(yàn)證簽名

    1. 通過(guò)公鑰解開(kāi)電子簽名,得到摘要D1。(如果解不開(kāi),信息來(lái)源主體校驗(yàn)失?。?/p>

    2. 計(jì)算原始信息的摘要D2。

    3. 對(duì)比D1、D2,如果D1等于D2,說(shuō)明原始信息完整、未被篡改。

    附:簽名驗(yàn)證偽代碼

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

    3、對(duì)比非對(duì)稱(chēng)加密

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

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

    2. 簽名/驗(yàn)證:私鑰簽名,公鑰驗(yàn)證。

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

    常見(jiàn)的對(duì)稱(chēng)加密算法,如AES、DES都采用了分組加密模式。這其中,有三個(gè)關(guān)鍵的概念需要掌握:模式、填充、初始化向量。

    搞清楚這三點(diǎn),才會(huì)知道crypto模塊對(duì)稱(chēng)加密API的參數(shù)代表什么含義,出了錯(cuò)知道如何去排查。

    1、分組加密模式

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

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

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

    圖片來(lái)源:這里,更多關(guān)于分組加密模式的介紹可以參考 wiki。

    后面假設(shè)每個(gè)塊的長(zhǎng)度為128位

    2、初始化向量:IV

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

    以CBC為例,每一個(gè)數(shù)據(jù)塊,都與前一個(gè)加密塊進(jìn)行亦或運(yùn)算后,再進(jìn)行加密。對(duì)于第一個(gè)數(shù)據(jù)塊,則是與IV進(jìn)行亦或。

    IV的大小跟數(shù)據(jù)塊的大小有關(guān)(128位),跟秘鑰的長(zhǎng)度無(wú)關(guān)。

    如圖所示,圖片來(lái)源 這里

    3、填充:padding

    分組加密模式需要對(duì)長(zhǎng)度固定的塊進(jìn)行加密。分組拆分完后,最后一個(gè)數(shù)據(jù)塊長(zhǎng)度可能小于128位,此時(shí)需要進(jìn)行填充以滿(mǎn)足長(zhǎng)度要求。

    填充方式有多重。常見(jiàn)的填充方式有PKCS7。

    假設(shè)分組長(zhǎng)度為k字節(jié),最后一個(gè)分組長(zhǎng)度為k-last,可以看到:

    1. 不管明文長(zhǎng)度是多少,加密之前都會(huì)會(huì)對(duì)明文進(jìn)行填充 (不然解密函數(shù)無(wú)法區(qū)分最后一個(gè)分組是否被填充了,因?yàn)榇嬖谧詈笠粋€(gè)分組長(zhǎng)度剛好等于k的情況)

    2. 如果最后一個(gè)分組長(zhǎng)度等于k-last === k,那么填充內(nèi)容為一個(gè)完整的分組 k k k ... k (k個(gè)字節(jié))

    3. 如果最后一個(gè)分組長(zhǎng)度小于k-last < k,那么填充內(nèi)容為 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

    概括來(lái)說(shuō)

    1. 分組加密:先將明文切分成固定長(zhǎng)度的塊(128位),再進(jìn)行加密。

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

    3. 填充(padding):部分加密模式,當(dāng)最后一個(gè)塊的長(zhǎng)度小于128位時(shí),需要通過(guò)特定的方式進(jìn)行填充。(ECB、CBC需要填充,CFB、OFB、CTR不需要填充)

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

    聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    Nodejscrypto模塊中安全基礎(chǔ)知識(shí)分享

    Nodejscrypto模塊中安全基礎(chǔ)知識(shí)分享:本文主要和大家分享Nodejs進(jìn)階:crypto模塊中你需要掌握的安全基礎(chǔ)知識(shí),希望能幫助到大家?;ヂ?lián)網(wǎng)時(shí)代,網(wǎng)絡(luò)上的數(shù)據(jù)量每天都在以驚人的速度增長(zhǎng)。同時(shí),各類(lèi)網(wǎng)絡(luò)安全問(wèn)題層出不窮。在信息安全重要性日益凸顯的今天,作為一名開(kāi)發(fā)者,需要加強(qiáng)對(duì)安全的認(rèn)識(shí),
    推薦度:
    標(biāo)簽: 安全 安全知識(shí) Nodejs
    • 熱門(mén)焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門(mén)推薦

    專(zhuān)題
    Top