本篇文章給大家分享的是有關(guān)Nodejs中如何使用crypto模塊,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
創(chuàng)新互聯(lián)專注于六安企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè),商城網(wǎng)站制作。六安網(wǎng)站建設(shè)公司,為六安等地區(qū)提供建站服務(wù)。全流程定制設(shè)計,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)crypto模塊是nodejs的核心模塊之一,它提供了安全相關(guān)的功能,如摘要運算、加密、電子簽名等。很多初學(xué)者對著長長的API列表,不知如何上手,因此它背后涉及了大量安全領(lǐng)域的知識。
本文重點講解API背后的理論知識,主要包括如下內(nèi)容:
摘要(hash)、基于摘要的消息驗證碼(HMAC)
對稱加密、非對稱加密、電子簽名
分組加密模式
摘要(hash)
摘要(digest):將長度不固定的消息作為輸入,通過運行hash函數(shù),生成固定長度的輸出,這段輸出就叫做摘要。通常用來驗證消息完整、未被篡改。
摘要運算是不可逆的。也就是說,輸入固定的情況下,產(chǎn)生固定的輸出。但知道輸出的情況下,無法反推出輸入。
偽代碼如下。
digest = Hash(message)
常見的摘要算法 與 對應(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進制 // 5d41402abc4b2a76b9719d911017c592
備注:在各類文章或文獻中,摘要、hash、散列 這幾個詞經(jīng)常會混用,導(dǎo)致不少初學(xué)者看了一臉懵逼,其實大部分時候指的都是一回事,記住上面對摘要的定義就好了。
MAC、HMAC
MAC(Message Authentication Code):消息認證碼,用以保證數(shù)據(jù)的完整性。運算結(jié)果取決于消息本身、秘鑰。
MAC可以有多種不同的實現(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
對稱加密、非對稱加密
加密/解密:給定明文,通過一定的算法,產(chǎn)生加密后的密文,這個過程叫加密。反過來就是解密。
encryptedText = encrypt( plainText ) plainText = decrypt( encryptedText )
秘鑰:為了進一步增強加/解密算法的安全性,在加/解密的過程中引入了秘鑰。秘鑰可以視為加/解密算法的參數(shù),在已知密文的情況下,如果不知道解密所用的秘鑰,則無法將密文解開。
encryptedText = encrypt(plainText, encryptKey) plainText = decrypt(encryptedText, decryptKey)
根據(jù)加密、解密所用的秘鑰是否相同,可以將加密算法分為對稱加密、非對稱加密。
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、對比與應(yīng)用
除了秘鑰的差異,還有運算速度上的差異。通常來說:
對稱加密速度要快于非對稱加密。
非對稱加密通常用于加密短文本,對稱加密通常用于加密長文本。
兩者可以結(jié)合起來使用,比如HTTPS協(xié)議,可以在握手階段,通過RSA來交換生成對稱秘鑰。在之后的通訊階段,可以使用對稱加密算法對數(shù)據(jù)進行加密,秘鑰則是握手階段生成的。
備注:對稱秘鑰交換不一定通過RSA,還可以通過類似DH來完成,這里不展開。
數(shù)字簽名
從簽名大致可以猜到數(shù)字簽名的用途。主要作用如下:
確認信息來源于特定的主體。
確認信息完整、未被篡改。
為了達到上述目的,需要有兩個過程:
發(fā)送方:生成簽名。
接收方:驗證簽名。
1、發(fā)送方生成簽名
計算原始信息的摘要。
通過私鑰對摘要進行簽名,得到電子簽名。
將原始信息、電子簽名,發(fā)送給接收方。
附:簽名偽代碼
digest = hash(message); // 計算摘要 digitalSignature = sign(digest, priviteKey); // 計算數(shù)字簽名
2、接收方驗證簽名
通過公鑰解開電子簽名,得到摘要D1。(如果解不開,信息來源主體校驗失?。?/p>
計算原始信息的摘要D2。
對比D1、D2,如果D1等于D2,說明原始信息完整、未被篡改。
附:簽名驗證偽代碼
digest1 = verify(digitalSignature, publicKey); // 獲取摘要 digest2 = hash(message); // 計算原始信息的摘要 digest1 === digest2 // 驗證是否相等
3、對比非對稱加密
由于RSA算法的特殊性,加密/解密、簽名/驗證 看上去特別像,很多同學(xué)都很容易混淆。先記住下面結(jié)論,后面有時間再詳細介紹。
加密/解密:公鑰加密,私鑰解密。
簽名/驗證:私鑰簽名,公鑰驗證。
分組加密模式、填充、初始化向量
常見的對稱加密算法,如AES、DES都采用了分組加密模式。這其中,有三個關(guān)鍵的概念需要掌握:模式、填充、初始化向量。
搞清楚這三點,才會知道crypto模塊對稱加密API的參數(shù)代表什么含義,出了錯知道如何去排查。
1、分組加密模式
所謂的分組加密,就是將(較長的)明文拆分成固定長度的塊,然后對拆分的塊按照特定的模式進行加密。
常見的分組加密模式有:ECB(不安全)、CBC(最常用)、CFB、OFB、CTR等。
以最簡單的ECB為例,先將消息拆分成等分的模塊,然后利用秘鑰進行加密。
后面假設(shè)每個塊的長度為128位
2、初始化向量:IV
為了增強算法的安全性,部分分組加密模式(CFB、OFB、CTR)中引入了初始化向量(IV),使得加密的結(jié)果隨機化。也就是說,對于同一段明文,IV不同,加密的結(jié)果不同。
以CBC為例,每一個數(shù)據(jù)塊,都與前一個加密塊進行亦或運算后,再進行加密。對于第一個數(shù)據(jù)塊,則是與IV進行亦或。
IV的大小跟數(shù)據(jù)塊的大小有關(guān)(128位),跟秘鑰的長度無關(guān)。
3、填充:padding
分組加密模式需要對長度固定的塊進行加密。分組拆分完后,最后一個數(shù)據(jù)塊長度可能小于128位,此時需要進行填充以滿足長度要求。
填充方式有多重。常見的填充方式有PKCS7。
假設(shè)分組長度為k字節(jié),最后一個分組長度為k-last,可以看到:
不管明文長度是多少,加密之前都會會對明文進行填充 (不然解密函數(shù)無法區(qū)分最后一個分組是否被填充了,因為存在最后一個分組長度剛好等于k的情況)
如果最后一個分組長度等于k-last === k,那么填充內(nèi)容為一個完整的分組 k k k ... k (k個字節(jié))
如果最后一個分組長度小于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
概括來說
分組加密:先將明文切分成固定長度的塊(128位),再進行加密。
分組加密的幾種模式:ECB(不安全)、CBC(最常用)、CFB、OFB、CTR。
填充(padding):部分加密模式,當(dāng)最后一個塊的長度小于128位時,需要通過特定的方式進行填充。(ECB、CBC需要填充,CFB、OFB、CTR不需要填充)
初始化向量(IV):部分加密模式(CFB、OFB、CTR)會將 明文塊 與 前一個密文塊進行亦或操作。對于第一個明文塊,不存在前一個密文塊,因此需要提供初始化向量IV(把IV當(dāng)做第一個明文塊 之前的 密文塊)。此外,IV也可以讓加密結(jié)果隨機化。
以上就是Nodejs中如何使用crypto模塊,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司行業(yè)資訊頻道。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。