Nodejs中crypto模塊的用法

這篇文章主要介紹“Nodejs中crypto模塊的用法”,在日常操作中,相信很多人在Nodejs中crypto模塊的用法問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Nodejs中crypto模塊的用法”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

成都創(chuàng)新互聯(lián)主營(yíng)南澳網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都app軟件開(kāi)發(fā)公司,南澳h5小程序開(kāi)發(fā)搭建,南澳網(wǎng)站營(yíng)銷推廣歡迎南澳等地區(qū)企業(yè)咨詢

crypto是node.js中實(shí)現(xiàn)加密和解密的模塊,下面本篇文章帶大家了解一下crypto模塊,介紹一下利用crypto模塊進(jìn)行散列(哈希)算法、HMAC算法、對(duì)稱加密、非對(duì)稱加密的方法。

1. crypto

cryptonode.js中實(shí)現(xiàn)加密和解密的模塊,在node.js中,使用OpenSSL類庫(kù)作為內(nèi)部實(shí)現(xiàn)加密解密的手段, OpenSSL是一個(gè)經(jīng)過(guò)嚴(yán)格測(cè)試的可靠的加密與解密算法的實(shí)現(xiàn)工具。【推薦學(xué)習(xí):《nodejs 教程》】

windows版openSSL下載

http://dl.pconline.com.cn/download/355862-1.html

2. 散列(哈希)算法

散列算法也叫哈希算法,用來(lái)把任意長(zhǎng)度的輸入變換成固定長(zhǎng)度的輸出,常見(jiàn)的有md5,sha1等

  • 相同的輸入會(huì)產(chǎn)生相同的輸出

  • 不同的輸出會(huì)產(chǎn)生不同的輸出

  • 任意的輸入長(zhǎng)度輸出長(zhǎng)度是相同的

  • 不能從輸出推算出輸入的值

Nodejs中crypto模塊的用法

2.1 獲取所有的散列算法

console.log(crypto.getHashes());

2.2 語(yǔ)法說(shuō)明

crypto.createHash(algorithm);//創(chuàng)建HASH對(duì)象
hash.update(data,[input_encoding]);//增加要添加摘要的數(shù)據(jù),摘要輸出前可以使用多次update
hash.digest([encoding]);//輸出摘要內(nèi)容,輸出后則不能再添加摘要內(nèi)容

2.3 散列算法示例

var crypto = require('crypto');
var md5 = crypto.createHash('md5');//返回哈希算法
var md5Sum = md5.update('hello');//指定要摘要的原始內(nèi)容,可以在摘要被輸出之前使用多次update方法來(lái)添加摘要內(nèi)容
var result = md5Sum.digest('hex');//摘要輸出,在使用digest方法之后不能再向hash對(duì)象追加摘要內(nèi)容。
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);//指定要摘要的原始內(nèi)容,可以在摘要被輸出之前使用多次update方法來(lái)添加摘要內(nèi)容
});
rs.on('end', function () {
    var result = shasum.digest('hex');//摘要輸出,在使用digest方法之后不能再向hash對(duì)象追加摘要內(nèi)容。
    console.log(result);
})

3. HMAC算法

HMAC算法將散列算法與一個(gè)密鑰結(jié)合在一起,以阻止對(duì)簽名完整性的破壞

Nodejs中crypto模塊的用法

3.1 語(yǔ)法

let hmac crypto.createHmac(algorithm,key);
hmac.update(data);
  • algorithm 是一個(gè)可用的摘要算法,例如 sha1、md5、sha256

  • key為一個(gè)字符串,用于指定一個(gè)PEM格式的密鑰

3.2 生成私鑰

PEM是OpenSSL的標(biāo)準(zhǔn)格式,OpenSSL使用PEM文件格式存儲(chǔ)證書和密鑰,是基于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. 對(duì)稱加密

  • blowfish算法是一種對(duì)稱的加密算法,對(duì)稱的意思就是加密和解密使用的是同一個(gè)密鑰。

Nodejs中crypto模塊的用法

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. 非對(duì)稱加密算法

  • 非對(duì)稱加密算法需要兩個(gè)密鑰:公開(kāi)密鑰(publickey)和私有密鑰(privatekey)

  • 公鑰與私鑰是一對(duì),如果用公鑰對(duì)數(shù)據(jù)進(jìn)行加密,只有用對(duì)應(yīng)的私鑰才能解密,如果私鑰加密,只能公鑰解密

  • 因?yàn)榧用芎徒饷苁褂玫氖莾蓚€(gè)不同的密鑰,所以這種算法叫作非對(duì)稱加密算法

Nodejs中crypto模塊的用法

為私鑰創(chuàng)建公鑰

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. 簽名

在網(wǎng)絡(luò)中,私鑰的擁有者可以在一段數(shù)據(jù)被發(fā)送之前先對(duì)數(shù)據(jù)進(jìn)行簽名得到一個(gè)簽名 通過(guò)網(wǎng)絡(luò)把此數(shù)據(jù)發(fā)送給數(shù)據(jù)接收者之后,數(shù)據(jù)的接收者可以通過(guò)公鑰來(lái)對(duì)該簽名進(jìn)行驗(yàn)證,以確保這段數(shù)據(jù)是私鑰的擁有者所發(fā)出的原始數(shù)據(jù),且在網(wǎng)絡(luò)中的傳輸過(guò)程中未被修改。

Nodejs中crypto模塊的用法

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

到此,關(guān)于“Nodejs中crypto模塊的用法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

本文題目:Nodejs中crypto模塊的用法
URL標(biāo)題:http://bm7419.com/article42/jdighc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷、網(wǎng)站排名網(wǎng)頁(yè)設(shè)計(jì)公司、域名注冊(cè)App設(shè)計(jì)、建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)