nodeJS之crypto模塊公鑰加密及解密


nodeJS之crypto模塊公鑰加密及解密

NodeJS有以下4個與公鑰加密相關的類。
1. Cipher: 用於加密數據;
2. Decipher: 用於解密數據;
3. Sign: 用於生成簽名;
4. Verify: 用於驗證簽名;

在使用公鑰加密技術時,需要使用公鑰及私鑰,公鑰是用於創建只有私鑰的擁有者能夠讀出的加密數據,以及對私鑰的擁有者的簽名進行驗證;私鑰是用於解密數據以及對數據進行簽名。

一:加密數據
在crypto模塊中,Cipher類用於對數據進行加密操作;我們可以通過如下兩種方式創建cipher對象;

1.1 createCipher方法;該方法使用指定的算法與密碼來創建cipher對象。該方法使用方式如下:

crypto.createCipher(params, pasword);

該方法使用兩個參數,第一個參數用於指定在加密數據時所使用的算法,比如 'ase-256-cbc'這些等,第二個參數用於指定加密時所使用的密碼,該參數值必須為一個二進制格式的字符串或一個Buffer對象。

createCipher 方法返回一個被創建的cipher對象。

1.2 createCipheriv方法;該方法使用指定的算法、密碼與初始向量、來創建cipher對象,使用方法如下所示:

crypto.createCipheriv(params, password, iv);

該方法的第一個參數是在加密數據時所使用的算法,比如 'ase-256-cbc'等等,第二個參數用於指定加密時所使用的密碼,該參數值必須為一個二進制格式的字符串或一個Buffer對象。 第三個參數指定加密時所使用的初始向量,參數值也必須為一個二進制格式的字符串或一個Buffer對象。
該方法返回的也是一個被創建的cipher對象。

1.3 在上面通過兩種方式創建了cipher對象后,可以通過使用該對象的update方法來指定需要被加密的數據,該方法使用的方式如下:

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)); // 輸出  我不是笨蛋


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM