NodeJs簡明教程將從零開始學習NodeJs相關知識,助力JS開發者構建全棧開發技術棧!算法
本文是NodeJs簡明教程的第六篇,將介紹NodeJs crypto模塊相關的基本操做。微信
crypto 模塊提供了加密功能,包括對 OpenSSL 的哈希、HMAC、加密、解密、簽名、以及驗證功能的一整套封裝。工具
Hash類是用於建立數據哈希值的工具類。學習
哈希算法嚴格來講並不屬於加密算法,傳統意義上的 加密 是與 解密 相配對的。哈希算法可以保證被哈希的內容不被篡改。針對任意長度的輸入數據均可以產生固定位數的哈希值。ui
crypto模塊對hash的操做是一致的,除了算法名不一致以外,本文以 md5 和 sha1 做爲示例。編碼
const crypto = require('crypto');
const hash = crypto.createHash('md5'); // 建立MD5 hash示例
hash.update('111111'); // 待計算hash的數據
console.log(hash.digest('hex'));
複製代碼
以上例程輸出 96e79218965eb72c92a549dd5a330112
加密
const crypto = require('crypto');
const hash = crypto.createHash('sha1'); // 建立MD5 hash示例
hash.update('111111'); // 待計算hash的數據
console.log(hash.digest('hex'));
複製代碼
以上例程輸出 3d4f2bf07dc1be38b20cd6e46949a1071f9d0e3d
spa
Base64
並非crypto
模塊的成員,可是跟本節內容比較相近,因此放過來了。Base64是一套編碼算法,經常使用在二進制數據編碼上。3d
const data = '111111';
const encodedData = Buffer.from(data, 'utf8').toString('base64'); // 輸入編碼爲utf8,輸出爲base64
console.log(encodedData);
複製代碼
以上例程輸出 MTExMTEx
code
const data = 'MTExMTEx';
const decodedData = Buffer.from(data, 'base64').toString('utf8'); // 輸入編碼爲base64,輸出編碼爲utf8
console.log(decodedData);
複製代碼
以上例程輸出111111
Hmac類是用於建立加密Hmac摘要的工具。
Hmac算法也是一種hash算法,可是它須要一個密鑰,針對一樣的輸入,傳統的hash算法輸出是固定的。 可是Hmac的輸出會隨着密鑰的不一樣而不一樣。
const crypto = require('crypto');
const hmac = crypto.createHmac('sha256', 'secret-key');
hmac.update('Hello, world!');
console.log(hmac.digest('hex'));
複製代碼
以上例程輸出 f4d850b1017eb4e20e0c58443919033c90cc9f4fe889b4d6b4572a4a0ec2d08a
AES是一種經常使用的對稱加密算法,加解密都用同一個密鑰。
const crypto = require('crypto');
const cipher = crypto.createCipheriv('aes192', '111111111111111111111111', '1111111111111111')
var crypted = cipher.update('1', 'utf8', 'hex');
crypted += cipher.final('hex');
console.log(crypted);
複製代碼
以上例程輸出 5bb3e6eb39e502b5fa74d93796087efa
說明:
createCipheriv
原型以下:
crypto.createCipheriv(algorithm,key,iv [,options])
iv
是初始化向量,能夠 爲空 或者 16 字節的字符串key
是加密密鑰,根據選用的算法不一樣,密鑰長度也不一樣,對應關係以下:
aes128
對應16位
長度密鑰aes192
對應24位
長度祕鑰aes256
對應32位
長度密鑰const crypto = require('crypto');
const cipher = crypto.createDecipheriv('aes192', '111111111111111111111111', '1111111111111111')
var data = cipher.update('5bb3e6eb39e502b5fa74d93796087efa', 'hex', 'utf8'); // 輸入數據編碼爲hex(16進制),輸出爲utf8
data += cipher.final('utf8');
console.log(data);
複製代碼
以上例程輸出1
crypto.createDecipheriv
方法原型與crypto.createCipher
一致,這裏不在贅述。
RSA算法是一種非對稱加密算法,即由一個私鑰和一個公鑰構成的密鑰對,經過私鑰加密,公鑰解密,或者經過公鑰加密,私鑰解密。其中,公鑰能夠公開,私鑰必須保密。
使用RSA算法前必須提供密鑰對,本文使用openssl
命令進行生成。
openssl genrsa -out private.pem 2048
生成2048位
長度的私鑰
openssl rsa -in private.pem -pubout -out public.pem
導出公鑰這樣在當前目錄咱們就獲得了private.pem
和public.pem
const crypto = require('crypto');
const fs = require('fs');
const privateKey = fs.readFileSync('./private.pem', { encoding: 'utf8' });
const encodedData = crypto.privateEncrypt(privateKey, Buffer.from('111111','utf8')); // 傳入utf8編碼的數據
console.log(encodedData.toString('hex'));
複製代碼
以上例程輸出
44a1b50b9639e4cbe17d55ca57dcb041387acadae3d3721fd9803a3a33091a36d59977feaa6caad990e58b9542c26297de6014e20819f0a71eadd0793bfe0fac834f30d2a05f8b329a3b2409e9f8b7fbd7de3734ada00228b84027568be58a2a34ccf0c4a8b2d02c58eef510931423ed5f40c696361b606df11609248b271aebcd17f9a113f98a8fa86c9c45bd609256f4779ce01ea3027171fffb35e695f1c38553aecafb72a2f46a9012246fde0f2934eacba8932bca38e228f4f4294873ed75d9acf79ab854897ebaab2375384b2da682c1b2e2b49b0592929067b3d5a11971d912629a178691345f7f88137343588b5c51d60643e5c00998484727b8c4a8
複製代碼
const crypto = require('crypto');
const fs = require('fs');
const publicKey = fs.readFileSync('./public.pem', { encoding: 'utf8' });
const encodedData = '44a1b50b9639e4cbe17d55ca57dcb041387acadae3d3721fd9803a3a33091a36d59977feaa6caad990e58b9542c26297de6014e20819f0a71eadd0793bfe0fac834f30d2a05f8b329a3b2409e9f8b7fbd7de3734ada00228b84027568be58a2a34ccf0c4a8b2d02c58eef510931423ed5f40c696361b606df11609248b271aebcd17f9a113f98a8fa86c9c45bd609256f4779ce01ea3027171fffb35e695f1c38553aecafb72a2f46a9012246fde0f2934eacba8932bca38e228f4f4294873ed75d9acf79ab854897ebaab2375384b2da682c1b2e2b49b0592929067b3d5a11971d912629a178691345f7f88137343588b5c51d60643e5c00998484727b8c4a8';
const rawData = crypto.publicDecrypt(publicKey, Buffer.from(encodedData, 'hex')); // 傳入hex(16進制)數據
console.log(rawData.toString('utf8'));
複製代碼
以上例程輸出
111111
複製代碼
經常使用的加解密、哈希、編解碼用法已經介紹完畢,讀後有疑問請加微信羣討論。
加入微信羣討論 關注公衆號獲取持續更新