nodeJS之crypto模塊公鑰加密及解密node
NodeJS有如下4個與公鑰加密相關的類。
1. Cipher: 用於加密數據;
2. Decipher: 用於解密數據;
3. Sign: 用於生成簽名;
4. Verify: 用於驗證簽名;算法
在使用公鑰加密技術時,須要使用公鑰及私鑰,公鑰是用於建立只有私鑰的擁有者可以讀出的加密數據,以及對私鑰的擁有者的簽名進行驗證;私鑰是用於解密數據以及對數據進行簽名。緩存
一:加密數據
在crypto模塊中,Cipher類用於對數據進行加密操做;咱們能夠經過以下兩種方式建立cipher對象;ui
1.1 createCipher方法;該方法使用指定的算法與密碼來建立cipher對象。該方法使用方式以下:編碼
crypto.createCipher(params, pasword);
該方法使用兩個參數,第一個參數用於指定在加密數據時所使用的算法,好比 'ase-256-cbc'這些等,第二個參數用於指定加密時所使用的密碼,該參數值必須爲一個二進制格式的字符串或一個Buffer對象。加密
createCipher 方法返回一個被建立的cipher對象。spa
1.2 createCipheriv方法;該方法使用指定的算法、密碼與初始向量、來建立cipher對象,使用方法以下所示:code
crypto.createCipheriv(params, password, iv);
該方法的第一個參數是在加密數據時所使用的算法,好比 'ase-256-cbc'等等,第二個參數用於指定加密時所使用的密碼,該參數值必須爲一個二進制格式的字符串或一個Buffer對象。 第三個參數指定加密時所使用的初始向量,參數值也必須爲一個二進制格式的字符串或一個Buffer對象。
該方法返回的也是一個被建立的cipher對象。對象
1.3 在上面經過兩種方式建立了cipher對象後,能夠經過使用該對象的update方法來指定須要被加密的數據,該方法使用的方式以下:blog
cipher.update(data, [input_encoding], [output_encoding])
其中第一個參數爲必選項(其餘的參數爲可選項), 該參數值是一個Buffer對象或一個字符串,用於指定須要加密的數據。第二個參數用於指定被加密的數據所使用的編碼格式,可指定參數值爲 'utf-8', 'ascii' 或 'binary'. 若是不使用第二個參數的話,那麼第一個參數必須爲一個Buffer對象。
第三個參數用於指定輸出加密數據時使用的編碼格式,可指定的參數值爲 'hex', 'binary' 或 'base64' 等。若是不使用第三個參數的話,該方法就返回了一個存放了加密數據的Buffer對象。
1.4 能夠使用cipher對象的final方法來返回加密數據。當該方法被調用時,任何cipher對象中所緩存的數據都將被加密。在使用了cipher對象的final方法
後,不能再向cipher對象中追加加密數據,該方法使用方式以下:
cipher.final([output_encoding]);
該方法使用一個可選參數,該參數值爲一個字符串,用於指定在輸出加密數據的編碼格式,可指定參數值爲 'hex', 'binary', 及 'base64'. 若是使用了
該參數,那麼final方法返回字符串格式的加密數據,若是不使用該參數,那麼該方法就返回一個Buffer對象。
具體使用的代碼以下:
const crypto = require('crypto'); /* 下面是使用加密算法對 '我不是笨蛋' 幾個字進行加密,所加密使用的密碼是 123456 */ const data = '我不是笨蛋'; const password = '123456'; // 建立加密算法 const aseEncode = function(data, password) { // 以下方法使用指定的算法與密碼來建立cipher對象 const cipher = crypto.createCipher('aes192', password); // 使用該對象的update方法來指定須要被加密的數據 let crypted = cipher.update(data, 'utf-8', 'hex'); crypted += cipher.final('hex'); return crypted; }; console.log(aseEncode(data, password)); // 輸出 ebdf98c254b9aa5265f6d4a5e73f861d
二:解密數據
在crypto模塊中,Decipher類用於對加密後的數據進行解密操做。
建立一個decipher對象,能夠經過以下兩種方式進行建立:
2.1 createDecipher方法,該方法使用指定的算法與密碼來建立 decipher對象,該方法使用的方式以下:
crypto.createDecipher(params, password);
在該方法中,第一個參數用於指定在解密數據時所使用的算法,好比 'aes-256-cbc'等,該算法必須與加密數據時所使用的算法保持一致。
第二個參數用於指定解密時所使用的密碼,其參數值爲一個二進制格式的字符串或一個Buffer對象,該密碼一樣必須與加密該數據時所使用的密碼保持一致。
createDecipher方法返回一個被建立的 decipher對象。
2.2 createDecipheriv方法;該方法使用指定的算法、密碼與初始向量來建立decipher對象。該方法使用以下所示:
crypto.createDecipheriv(params, password, iv);
在該方法中,第一個參數用於指定在解密數據時所使用的算法,好比 'aes-256-cbc'等,該算法必須與加密數據時所使用的算法保持一致。第二個參數用於指定解密時所使用的密碼,參數值必須爲一個二進制格式的字符串或一個Buffer對象,一樣的道理,該密碼必須與加密該數據時所使用的密碼保持一致。
第三個參數用於指定解密時所使用的初始向量,該參數值也必須爲一個二進制格式的字符串或者一個Buffer對象,該初始向量必須與加密該數據時所使用的初始向量保持一致。
2.3 在建立了decipher對象以後,能夠經過使用該對象的update方法來指定須要被解密的數據。該方法使用以下所示:
decipher.update(data, [input_encoding], [output_encoding]);
在該方法中,第一個參數爲一個Buffer對象或一個字符串,用於指定須要被解密的數據,第二個參數用於指定被解密數據所使用的編碼格式,可指定的參數值爲 'hex', 'binary', 'base64'等,若是不使用第二個參數的話,那麼參數值必須爲一個buffer對象。第三個參數用於指定輸出解密數據時使用的編碼格式,可選參數值爲'utf-8', 'ascii' 或 'binary';
2.4 能夠使用decipher對象的final方法來返回通過解密以後的原始數據,該方法使用以下所示:
decipher.final([output_encoding]);
在該對象的final方法中,使用了一個可選參數,參數值爲一個字符串,用於指定在輸出解密數據時使用的編碼格式,可指定參數值爲 'utf-8', 'ascii' 或 'binary';
若是使用了 該參數,final返回字符串格式的解密數據,若是不使用該參數,final方法返回一個Buffer對象。
以下解密數據的代碼:
const crypto = require('crypto'); /* 下面是使用加密算法對 '我不是笨蛋' 幾個字進行加密,所加密使用的密碼是 123456 */ const data = '我不是笨蛋'; const password = '123456'; // 建立加密算法 const aseEncode = function(data, password) { // 以下方法使用指定的算法與密碼來建立cipher對象 const cipher = crypto.createCipher('aes192', password); // 使用該對象的update方法來指定須要被加密的數據 let crypted = cipher.update(data, 'utf-8', 'hex'); crypted += cipher.final('hex'); return crypted; }; console.log(aseEncode(data, password)); // 輸出 ebdf98c254b9aa5265f6d4a5e73f861d // 建立解密算法 const aseDecode = function(data, password) { /* 該方法使用指定的算法與密碼來建立 decipher對象, 第一個算法必須與加密數據時所使用的算法保持一致; 第二個參數用於指定解密時所使用的密碼,其參數值爲一個二進制格式的字符串或一個Buffer對象,該密碼一樣必須與加密該數據時所使用的密碼保持一致 */ const decipher = crypto.createDecipher('aes192', password); /* 第一個參數爲一個Buffer對象或一個字符串,用於指定須要被解密的數據 第二個參數用於指定被解密數據所使用的編碼格式,可指定的參數值爲 'hex', 'binary', 'base64'等, 第三個參數用於指定輸出解密數據時使用的編碼格式,可選參數值爲 'utf-8', 'ascii' 或 'binary'; */ let decrypted = decipher.update(data, 'hex', 'utf-8'); decrypted += decipher.final('utf-8'); return decrypted; }; console.log(aseDecode(aseEncode(data, password), password)); // 輸出 我不是笨蛋