Node 快速學習 crypto 模組

lio-mengxiang發表於2019-03-20

1. crypto

cryptonode.js中實現加密和解密的模組 在node.js中,使用OpenSSL類庫作為內部實現加密解密的手段 OpenSSL是一個經過嚴格測試的可靠的加密與解密演算法的實現工具

windows版openSSL下載

2. 雜湊(雜湊)演算法

雜湊演算法也叫雜湊演算法,用來把任意長度的輸入變換成固定長度的輸出,常見的有md5,sha1等

  • 相同的輸入會產生相同的輸出
  • 不同的輸出會產生不同的輸出
  • 任意的輸入長度輸出長度是相同的
  • 不能從輸出推算出輸入的值

md5

2.1 獲取所有的雜湊演算法

console.log(crypto.getHashes());
複製程式碼

2.2 語法說明

crypto.createHash(algorithm);//建立HASH物件
hash.update(data,[input_encoding]);//增加要新增摘要的資料,摘要輸出前可以使用多次update
hash.digest([encoding]);//輸出摘要內容,輸出後則不能再新增摘要內容
複製程式碼

2.3 雜湊演算法示例

var crypto = require('crypto');
var md5 = crypto.createHash('md5');//返回雜湊演算法
var md5Sum = md5.update('hello');//指定要摘要的原始內容,可以在摘要被輸出之前使用多次update方法來新增摘要內容
var result = md5Sum.digest('hex');//摘要輸出,在使用digest方法之後不能再向hash物件追加摘要內容。
console.log(result);
複製程式碼

多次update

var fs = require('fs');
var shasum = crypto.createHash('sha1');//返回sha1雜湊演算法
var rs = fs.createReadStream('./readme.txt');
rs.on('data', function (data) {
    shasum.update(data);//指定要摘要的原始內容,可以在摘要被輸出之前使用多次update方法來新增摘要內容
});
rs.on('end', function () {
    var result = shasum.digest('hex');//摘要輸出,在使用digest方法之後不能再向hash物件追加摘要內容。
    console.log(result);
})
複製程式碼

3. HMAC演算法

HMAC演算法將雜湊演算法與一個金鑰結合在一起,以阻止對簽名完整性的破壞

hmac

3.1 語法

let hmac crypto.createHmac(algorithm,key);
hmac.update(data);
複製程式碼
  • algorithm 是一個可用的摘要演算法,例如 sha1、md5、sha256
  • key為一個字串,用於指定一個PEM格式的金鑰

3.2 生成私鑰

PEM是OpenSSL的標準格式,OpenSSL使用PEM檔案格式儲存證書和金鑰,是基於Base64編碼的證書。

$ openssl genrsa -out rsa_private.key 1024
複製程式碼

3.3 示例

let pem = fs.readFileSync(path.join(__dirname, './rsa_private.key'));
let key = pem.toString('ascii');
let hmac = crypto.createHmac('sha1', key);
let rs = fs.createReadStream(path.join(__dirname, './1.txt'));
rs.on('data', function (data) {
    hmac.update(data);
});
rs.on('end', function () {
    let result = hmac.digest('hex');
    console.log(result);
});
複製程式碼

4. 對稱加密

  • blowfish演算法是一種對稱的加密演算法,對稱的意思就是加密和解密使用的是同一個金鑰。

encry

var crypto = require('crypto');
var fs = require('fs');
let str = 'hello';
let cipher = crypto.createCipher('blowfish', fs.readFileSync(path.join(__dirname, 'rsa_private.key')));
let encry = cipher.update(str, 'utf8','hex');
encry += cipher.final('hex');
console.log(encry);

let deciper = crypto.createDecipher('blowfish', fs.readFileSync(path.join(__dirname, 'rsa_private.key')));
let deEncry = deciper.update(encry, 'hex','utf8');
deEncry += deciper.final('utf8');
console.log(deEncry);
複製程式碼

5. 非對稱加密演算法

  • 非對稱加密演算法需要兩個金鑰:公開金鑰(publickey)和私有金鑰(privatekey)
  • 公鑰與私鑰是一對,如果用公鑰對資料進行加密,只有用對應的私鑰才能解密,如果私鑰加密,只能公鑰解密
  • 因為加密和解密使用的是兩個不同的金鑰,所以這種演算法叫作非對稱加密演算法

rsa

為私鑰建立公鑰

openssl rsa -in rsa_private.key -pubout -out rsa_public.key
複製程式碼
var crypto = require('crypto');
var fs = require('fs');
let key = fs.readFileSync(path.join(__dirname, 'rsa_private.key'));
let cert = fs.readFileSync(path.join(__dirname, 'rsa_public.key'));
let secret = crypto.publicEncrypt(cert, buffer);//公鑰加密
let result = crypto.privateDecrypt(key, secret);//私鑰解密
console.log(result.toString());
複製程式碼

6. 簽名

在網路中,私鑰的擁有者可以在一段資料被髮送之前先對資料進行簽名得到一個簽名 通過網路把此資料傳送給資料接收者之後,資料的接收者可以通過公鑰來對該簽名進行驗證,以確保這段資料是私鑰的擁有者所發出的原始資料,且在網路中的傳輸過程中未被修改。

sign

let private = fs.readFileSync(path.join(__dirname, 'rsa_private.key'), 'ascii');
let public = fs.readFileSync(path.join(__dirname, 'rsa_public.key'), 'ascii');
let str = 'zhufengpeixun';
let sign = crypto.createSign('RSA-SHA256');
sign.update(str);
let signed = sign.sign(private, 'hex');
let verify = crypto.createVerify('RSA-SHA256');
verify.update(str);
let verifyResult = verify.verify(public,signed,'hex'); //true複製程式碼


相關文章