最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Node.js之crypto加密模塊使用及說明

 更新時間:2026年05月18日 09:09:00   作者:吳聲子夜歌  
本文介紹了Node.js中的crypto模塊的使用方法,包括使用OpenSSL實現(xiàn)的各種加密、散列和簽名等驗算法,主要介紹了HMAC算法、RSA和md5等列算法、blowfish和aes加密算法、以及rsa、dsa和x9證書驗證算法等法,并提供了示例代碼

1、crypto模塊概述

在Node.js中,使用OpenSSL類庫作為其內(nèi)部實現(xiàn)加密與解密處理的基礎(chǔ)手段,這是因為目前OpenSSL已經(jīng)成為了一個經(jīng)過嚴格測試的可靠的加密與解密算法的實現(xiàn)工具。

在Node.js中,OpenSSL類庫被封裝在crypto模塊中,因此開發(fā)者可以使用crypto模塊來實現(xiàn)各種不同的加密與解密處理。例如,crypto模塊中包含了類似MD5或SH-2之類的散列算法。開發(fā)者也可以通過crypto模塊來實現(xiàn)HMAC運算 。在crypto模塊中,提供了一些加密方法來實現(xiàn)數(shù)據(jù)的可靠加密。另外,在crypto模塊中,也提供了一些利用HMAC運算來實現(xiàn)數(shù)字簽名以及對數(shù)字簽名進行驗證的方法。

1.1、支持的加密算法

在crypto模塊中,為每一種加密算法定義了一個類。可以使用getCiphers方法來查看Node.js中能夠使用的所有加密算法。

該方法的使用方式如下所示。

crypto.getCiphers()
aes-128-cbc
aes-128-cbc-hmac-sha1
aes-128-cbc-hmac-sha256
aes-128-ccm
aes-128-cfb
aes-128-cfb1
aes-128-cfb8
aes-128-ctr
aes-128-ecb
aes-128-gcm
aes-128-ocb
aes-128-ofb
aes-128-xts
aes-192-cbc
aes-192-ccm
aes-192-cfb
aes-192-cfb1
aes-192-cfb8
aes-192-ctr
aes-192-ecb
aes-192-gcm
aes-192-ocb
aes-192-ofb
aes-256-cbc
aes-256-cbc-hmac-sha1
aes-256-cbc-hmac-sha256
aes-256-ccm
aes-256-cfb
aes-256-cfb1
aes-256-cfb8
aes-256-ctr
aes-256-ecb
aes-256-gcm
aes-256-ocb
aes-256-ofb
aes-256-xts
aes128
aes128-wrap
aes192
aes192-wrap
aes256
aes256-wrap
aria-128-cbc
aria-128-ccm
aria-128-cfb
aria-128-cfb1
aria-128-cfb8
aria-128-ctr
aria-128-ecb
aria-128-gcm
aria-128-ofb
aria-192-cbc
aria-192-ccm
aria-192-cfb
aria-192-cfb1
aria-192-cfb8
aria-192-ctr
aria-192-ecb
aria-192-gcm
aria-192-ofb
aria-256-cbc
aria-256-ccm
aria-256-cfb
aria-256-cfb1
aria-256-cfb8
aria-256-ctr
aria-256-ecb
aria-256-gcm
aria-256-ofb
aria128
aria192
aria256
bf
bf-cbc
bf-cfb
bf-ecb
bf-ofb
blowfish
camellia-128-cbc
camellia-128-cfb
camellia-128-cfb1
camellia-128-cfb8
camellia-128-ctr
camellia-128-ecb
camellia-128-ofb
camellia-192-cbc
camellia-192-cfb
camellia-192-cfb1
camellia-192-cfb8
camellia-192-ctr
camellia-192-ecb
camellia-192-ofb
camellia-256-cbc
camellia-256-cfb
camellia-256-cfb1
camellia-256-cfb8
camellia-256-ctr
camellia-256-ecb
camellia-256-ofb
camellia128
camellia192
camellia256
cast
cast-cbc
cast5-cbc
cast5-cfb
cast5-ecb
cast5-ofb
chacha20
chacha20-poly1305
des
des-cbc
des-cfb
des-cfb1
des-cfb8
des-ecb
des-ede
des-ede-cbc
des-ede-cfb
des-ede-ecb
des-ede-ofb
des-ede3
des-ede3-cbc
des-ede3-cfb
des-ede3-cfb1
des-ede3-cfb8
des-ede3-ecb
des-ede3-ofb
des-ofb
des3
des3-wrap
desx
desx-cbc
id-aes128-CCM
id-aes128-GCM
id-aes128-wrap
id-aes128-wrap-pad
id-aes192-CCM
id-aes192-GCM
id-aes192-wrap
id-aes192-wrap-pad
id-aes256-CCM
id-aes256-GCM
id-aes256-wrap
id-aes256-wrap-pad
id-smime-alg-CMS3DESwrap
idea
idea-cbc
idea-cfb
idea-ecb
idea-ofb
rc2
rc2-128
rc2-40
rc2-40-cbc
rc2-64
rc2-64-cbc
rc2-cbc
rc2-cfb
rc2-ecb
rc2-ofb
rc4
rc4-40
rc4-hmac-md5
seed
seed-cbc
seed-cfb
seed-ecb
seed-ofb
sm4
sm4-cbc
sm4-cfb
sm4-ctr
sm4-ecb
sm4-ofb

1.2、支持的散列算法

使用getHashes方法查看所有散列算法:

crypto.getHashes()
RSA-MD4
RSA-MD5
RSA-MDC2
RSA-RIPEMD160
RSA-SHA1
RSA-SHA1-2
RSA-SHA224
RSA-SHA256
RSA-SHA3-224
RSA-SHA3-256
RSA-SHA3-384
RSA-SHA3-512
RSA-SHA384
RSA-SHA512
RSA-SHA512/224
RSA-SHA512/256
RSA-SM3
blake2b512
blake2s256
id-rsassa-pkcs1-v1_5-with-sha3-224
id-rsassa-pkcs1-v1_5-with-sha3-256
id-rsassa-pkcs1-v1_5-with-sha3-384
id-rsassa-pkcs1-v1_5-with-sha3-512
md4
md4WithRSAEncryption
md5
md5-sha1
md5WithRSAEncryption
mdc2
mdc2WithRSA
ripemd
ripemd160
ripemd160WithRSA
rmd160
sha1
sha1WithRSAEncryption
sha224
sha224WithRSAEncryption
sha256
sha256WithRSAEncryption
sha3-224
sha3-256
sha3-384
sha3-512
sha384
sha384WithRSAEncryption
sha512
sha512-224
sha512-224WithRSAEncryption
sha512-256
sha512-256WithRSAEncryption
sha512WithRSAEncryption
shake128
shake256
sm3
sm3WithRSAEncryption
ssl3-md5
ssl3-sha1
whirlpool

2、散列算法

  1. 在Node.js中,為了使用散列算法,首先應該使用createHash方法創(chuàng)建一個hash對象。createHash方法的使用方式如下所示。
crypto.createHash(algorithm)
  • algorithm:一個在Node.js中可以使用的算法,例如’sha1’、‘md5’、‘sha256’、'sha512’和’ripemd160’等
  1. 在創(chuàng)建了一個hash對象后,可以通過使用該對象的update方法創(chuàng)建一個摘要。該方法的使用方式如下所示(代碼中的hash代表一個hash對象)???梢栽谡惠敵銮笆褂枚啻蝩pdate方法來添加摘要內(nèi)容。
hash.update(data,[input_encoding])
  • data:一個Buffer對象或一個字符串,用于指定摘要內(nèi)容
  • input_encoding:可選,用于指定摘要內(nèi)容所需使用的編碼格式,可指定參數(shù)值為“utf8”?、?“ascii”或“binary”?。如果不使用input_encoding參數(shù),則data參數(shù)值必須為一個Buffer對象。
  1. 可以使用hash對象的digest方法來輸出摘要內(nèi)容。在使用了hash對象的digest方法后,不能再向hash對象中追加摘要內(nèi)容。digest方法的使用方式如下所示(代碼中的hash代表一個hash對象)?。
hash.digest([encoding])
  • encoding:可選,參數(shù)值為一個字符串,用于指定輸出摘要的編碼格式,可指定參數(shù)值為“hex”?、?“binary”及“base64”?。如果使用了該參數(shù),那么digest方法返回字符串格式的摘要內(nèi)容,如果不使用該參數(shù),那么digest方法返回一個Buffer對象。在hash對象的digest方法被調(diào)用之后,該對象不能再被使用。

示例:sha1算法為app.js生成一個摘要

const crypto = require("crypto");
const fs = require("fs");
let shasum = crypto.createHash('sha1');
let s = fs.ReadStream('./index.js');
s.on('data', (data)=>{
     shasum.update(data);
});
s.on('end', ()=>{
     let d = shasum.digest('hex');
     console.log(d);
});
//輸出
68e7997830b957c2d58645561b5e17af57b8bdbd

//使用openssl驗證

$ openssl dgst -sha1 index.js                                       
SHA1(index.js)= 68e7997830b957c2d58645561b5e17af57b8bdbd

3、HMAC算法

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

  1. 在Node.js中,為了使用HMAC算法,首先應該使用createHmac方法創(chuàng)建一個hmac對象。createHmac方法的使用方式如下所示。
crypto.createHmac(algorithm,key)
  • algorithm:一個在Node.js中可以使用的算法,例如’sha1’、‘md5’、‘sha256’、'sha512’和’ripemd160’等
  • key:為一個字符串,用于指定一個PEM格式的密鑰。

在OpenSSL工具中,可以使用如下命令創(chuàng)建一個密鑰。

openssl genrsa -out key.pem 1024
  1. 在創(chuàng)建了一個hmac對象后,可以通過使用該對象的update方法來創(chuàng)建一個摘要。該方法的使用方式如下所示(代碼中的hmac代表一個hmac對象)?。
hmac.update(data)
  • data:一個Buffer對象或一個字符串,用于指定摘要內(nèi)容??梢栽谡惠敵銮笆褂枚啻蝩pdate方法來添加摘要內(nèi)容。
  1. 可以使用hmac對象的digest方法輸出摘要內(nèi)容。在使用了hmac對象的digest方法后,不能再向hmac對象中追加摘要內(nèi)容。digest方法的使用方式如下所示(代碼中的hmac代表一個hmac對象)?。
hmac.digest([encoding])
  • encoding:可選,參數(shù)值為一個字符串,用于指定輸出摘要的編碼格式,可指定參數(shù)值為“hex”?、?“binary”及“base64”?。如果使用了該參數(shù),digest方法返回字符串格式的摘要內(nèi)容,如果不使用該參數(shù),digest方法返回一個Buffer對象。當hmac對象的digest方法被調(diào)用之后,該對象不能再被使用。

示例:使用sha1算法以及key.pem密鑰index.js文件生成一個摘要

const crypto = require('crypto');
const fs = require('fs');
let pem = fs.readFileSync('key.pem');
let key = pem.toString('ascii');
let shasum = crypto.createHmac('sha1',key);
let s = fs.ReadStream('./index.js');
s.on('data', (d)=>{
    shasum.update(d);
});
s.on('end', ()=>{
    var d = shasum.digest('hex');
    console.log(d);
});
48c97f16616f8aba06a8b9ec83989234e09f3b3d

4、公鑰加密

Node.js提供了以下4個與公鑰加密相關(guān)的類。

  • Cipher類:用于加密數(shù)據(jù)。
  • Decipher類:用于解密數(shù)據(jù)。
  • Sign類:用于生成簽名。
  • Verify類:用于驗證簽名。

在使用HMAC算法時,只需要使用一個私鑰,但在使用公鑰加密技術(shù)時,需要使用公鑰及私鑰,其中私鑰用于解密數(shù)據(jù)以及對數(shù)據(jù)進行簽名,而公鑰用于創(chuàng)建只有私鑰的擁有者能夠讀出的加密數(shù)據(jù),以及對私鑰的擁有者的簽名進行驗證。

在OpenSSL工具中,可以使用如下命令來為一個私鑰創(chuàng)建一個PEM格式的公鑰。

openssl req -key key.pem -new -x509 -out cert.pem

4.1、Cipher加密數(shù)據(jù)

  1. 在crypto模塊中,Cipher類用于對數(shù)據(jù)進行加密操作。在加密數(shù)據(jù)之前,首先需要創(chuàng)建一個cipher對象??梢酝ㄟ^如下所示的兩種方法創(chuàng)建cipher對象。

createCipher方法(不推薦):該方法使用指定的算法與密碼來創(chuàng)建cipher對象。該方法的使用方式如下所示。

crypto.createCipher(algorithm,password)
  • algorithm:指定在加密數(shù)據(jù)時所使用的算法,例如“blowfish’”?、?“aes-256-cbc”等。
  • password:指定加密時所使用的密碼,參數(shù)值必須為一個二進制格式的字符串或一個Buffer對象。

createCipheriv方法(推薦):該方法使用指定的算法、密碼與初始向量(Initialization Vector,IV)來創(chuàng)建cipher對象。該方法的使用方式如下:

crypto.createCipheriv(algorithm,password,iv)
  • algorithm:指定在加密數(shù)據(jù)時所使用的算法,例如“blowfish’”?、?“aes-256-cbc”等。
  • password:指定加密時所使用的密碼,參數(shù)值必須為一個二進制格式的字符串或一個Buffer對象。
  • iv:指定加密時所使用的初始向量,參數(shù)值必須為一個二進制格式的字符串或一個Buffer對象。

在Node.js中,使用分塊加密法進行加密。分塊加密法將固定長度的數(shù)據(jù)塊或純文本數(shù)據(jù)加密成長度相同的密碼塊數(shù)據(jù)。該轉(zhuǎn)換的前提是用戶提供密碼。在解密時,要使用相同的密碼對密碼塊數(shù)據(jù)進行逆轉(zhuǎn)換。此處的“固定長度”稱為數(shù)據(jù)塊的尺寸。根據(jù)使用算法的不同,數(shù)據(jù)塊的尺寸也各不相同。例如,在使用blowfish算法時,數(shù)據(jù)塊的尺寸為40字節(jié)。分塊加密法可以在網(wǎng)站被攻擊時防止加密數(shù)據(jù)以及加密時所使用的密碼泄漏。

  1. 在創(chuàng)建了一個cipher對象后,可以通過使用該對象的update方法來指定需要被加密的數(shù)據(jù)。該方法的使用方式如下所示(代碼中的cipher代表一個cipher對象)?。
cipher.update(data,[input_encoding],[output_encoding])
  • data:一個Buffer對象或一個字符串,用于指定需要加密的數(shù)據(jù)
  • input_encoding:可選,指定被加密的數(shù)據(jù)所需使用的編碼格式,可指定參數(shù)值為“utf8”?、?“ascii”及“binary”?。如果不使用input_encoding參數(shù),則data參數(shù)值必須為一個Buffer對象。
  • output_encoding:可選,指定輸出加密數(shù)據(jù)時使用的編碼格式,可指定參數(shù)值為“hex”?、?“binary”或“base64”?。

update方法返回被加密的數(shù)據(jù)。可以使用update方法多次以添加需要加密的數(shù)據(jù)。如果在update方法中使用output_encoding參數(shù),則該方法返回被編碼的字符串,如果在update方法中不使用output_encoding參數(shù),則該方法返回一個存放了加密數(shù)據(jù)的Buffer對象。

與hash對象及hmac對象的update方法不同的是,cipher對象的update方法總是返回一個被分塊的加密數(shù)據(jù),因此塊的大小是非常關(guān)鍵的。如果加密數(shù)據(jù)的字節(jié)數(shù)足夠創(chuàng)建一個或多個塊,update方法將返回被加密的數(shù)據(jù)。如果加密數(shù)據(jù)的字節(jié)數(shù)不足以創(chuàng)建一個塊,加密數(shù)據(jù)將被緩存在cipher對象中。

  1. 使用cipher對象的final方法來返回加密數(shù)據(jù)。當該方法被調(diào)用時,任何cipher對象中所緩存的數(shù)據(jù)都將被加密,如果加密數(shù)據(jù)的字節(jié)數(shù)不足以創(chuàng)建一個塊,將使用PKCS填充方式來填充這個塊。在使用了cipher對象的final方法后,不能再向cipher對象中追加加密數(shù)據(jù)。final方法的使用方式如下所示(代碼中的cipher代表一個cipher對象)?。
cipher.final([output_encoding])
  • output_encoding:一個字符串,用于指定在輸出加密數(shù)據(jù)的編碼格式,可指定參數(shù)值為“hex”?、?“binary”及“base64”?。如果使用了該參數(shù),那么final方法返回字符串格式的加密數(shù)據(jù),如果不使用該參數(shù),那么final方法返回一個Buffer對象。當cipher對象的final方法被調(diào)用之后,該對象不能再被使用。

示例:使用cipher對象加密“test”字符串,加密算法為blowfish,密碼從應用程序根目錄下的key.pem私鑰中讀出,在完成數(shù)據(jù)加密后,在控制臺中輸出加密數(shù)據(jù)的hex編碼格式字符串。

const crypto = require('crypto');
const fs = require('fs');
let pem = fs.readFileSync('key.pem');
let key = pem.toString('ascii');
let cipher = crypto.createCipheriv('blowfish', key, Buffer.from('12345678'));
let text = "test";
cipher.update(text,'binary','hex');
let crypted = cipher.final('hex')
console.log(crypted);
44e0d7b155a3a89f

4.2、Decipher解密

  1. 在crypto模塊中,Decipher類用于對加密后的數(shù)據(jù)進行解密操作。在解密數(shù)據(jù)之前,首先需要創(chuàng)建一個decipher對象??梢酝ㄟ^如下所示的兩種方法創(chuàng)建decipher對象。

createDecipher方法(不推薦):該方法使用指定的算法與密碼來創(chuàng)建decipher對象。該方法的使用方式如下所示。

crypto.createDecipher(algorithm,password)
  • algorithm:指定在解密數(shù)據(jù)時所使用的算法,例如“blowfish”?、?“aes-256-cbc”等,該算法必須與加密該數(shù)據(jù)時所使用的算法保持一致。
  • password:password參數(shù)用于指定解密時所使用的密碼,其參數(shù)值必須為一個二進制格式的字符串或一個Buffer對象,該密碼必須與加密該數(shù)據(jù)時所使用的密碼保持一致。

createDecipheriv方法(推薦)*:該方法使用指定的算法、密碼與初始向量來創(chuàng)建decipher對象。該方法的使用方式如下所示。

crypto.createDecipheriv(algorithm,password,iv)
  • algorithm:指定在解密數(shù)據(jù)時所使用的算法,例如“blowfish”?、?“aes-256-cbc”等,該算法必須與加密該數(shù)據(jù)時所使用的算法保持一致
  • password:指定解密時所使用的密碼,參數(shù)值必須為一個二進制格式的字符串或一個Buffer對象,該密碼必須與加密該數(shù)據(jù)時所使用的密碼保持一致
  • iv:指定解密時所使用的初始向量,參數(shù)值必須為一個二進制格式的字符串或一個Buffer對象,該初始向量必須與加密該數(shù)據(jù)時所使用的初始向量保持一致。
  1. 在創(chuàng)建了一個decipher對象之后,可以通過使用該對象的update方法來指定需要被解密的數(shù)據(jù)。該方法的使用方式如下所示
decipher.update(data,[input_encoding],[output_encoding])
  • data:一個Buffer對象或一個字符串,用于指定需要被解密的數(shù)據(jù)
  • input_encoding:可選,指定被解密的數(shù)據(jù)所使用的編碼格式,可指定參數(shù)值為“hex”?、?“binary”及“base64”?。如果不使用input_encoding參數(shù),則data參數(shù)值必須為一個Buffer對象
  • output_encoding:可選,指定輸出解密數(shù)據(jù)時使用的編碼格式,可指定參數(shù)值為“utf8”?、?“ascii”或“binary”?

update方法返回被解密的數(shù)據(jù)??梢允褂枚啻蝩pdate方法來添加需要被解密的數(shù)據(jù)。如果在update方法中使用output_encoding參數(shù),該方法返回被編碼的字符串,如果在update方法中不使用output_encoding參數(shù),該方法返回一個存放了解密數(shù)據(jù)的Buffer對象。

  1. 使用decipher對象的final方法來返回經(jīng)過解密之后的原始數(shù)據(jù)。final方法的使用方式如下所示(代碼中的decipher代表一個decipher對象)?。
decipher.final([output_encoding])
  • output_encoding:可選,一個字符串,用于指定在輸出解密數(shù)據(jù)時使用的編碼格式,可指定參數(shù)值為“utf8”?、?“ascii”或“binary”?。如果使用了該參數(shù),final方法返回字符串格式的解密數(shù)據(jù),如果不使用該參數(shù),final方法返回一個Buffer對象。在decipher對象的final方法被調(diào)用之后,該對象不能再被使用。

示例:將經(jīng)過加密后的數(shù)據(jù)進行解密,并且在控制臺中輸出經(jīng)過解密操作后原始數(shù)據(jù)的utf8格式的字符串。

const crypto = require('crypto');
const fs = require('fs');
let pem = fs.readFileSync('key.pem');
let key = pem.toString('ascii');
let cipher = crypto.createCipheriv('blowfish', key, Buffer.from('12345678'));
let text = "test";
cipher.update(text,'binary','hex');
let crypted = cipher.final('hex')
console.log(crypted);

//解密
let decipher = crypto.createDecipheriv('blowfish', key, Buffer.from('12345678'));
let dec = decipher.update(crypted, 'hex', 'utf8');
dec += decipher.final('utf8');
console.log(dec);
44e0d7b155a3a89f
test

4.3、Sign簽名

在網(wǎng)絡中,私鑰的擁有者可以在一段數(shù)據(jù)被發(fā)送之前先對該數(shù)據(jù)進行簽名操作,在簽名的過程中,將對這段數(shù)據(jù)執(zhí)行加密處理。在經(jīng)過加密后的數(shù)據(jù)發(fā)送之后,數(shù)據(jù)的接收者可以通過公鑰的使用來對該簽名進行解密及驗證操作,以確保這段數(shù)據(jù)是私鑰的擁有者所發(fā)出的原始數(shù)據(jù),且在網(wǎng)絡的傳輸過程中未被修改。

  1. 在Node.js中,在進行簽名操作之前,首先需要使用createSign方法創(chuàng)建一個sign對象,該方法的使用方式如下所示。
crypto.createSign(algorithm)
  • algorithm:指定在加密該數(shù)據(jù)時所使用的算法,例如“RSA-SHA256”?。
  1. 在創(chuàng)建了一個sign對象后,可以通過使用該對象的update方法來指定需要被加密的數(shù)據(jù)。該方法的使用方式如下所示
sign.update(data)
  • data:一個Buffer對象或一個字符串,用于指定需要被加密的數(shù)據(jù)。可以在對數(shù)據(jù)進行簽名前使用多次update方法來添加數(shù)據(jù)。
  1. 使用sign對象的sign方法對數(shù)據(jù)進行簽名。在使用了sign對象的sign方法之后,不能再使用sign對象的update方法追加數(shù)據(jù)。sign方法的使用方式如下所示
sign.sign(private_key,[output_format])
  • private_key:一個字符串,用于指定PEM格式的私鑰
  • output_format:可選,指定簽名輸出時所使用的編碼格式,可指定參數(shù)值為“hex”?、?“binary”或“base64”?。如果使用了該參數(shù),sign方法返回字符串格式的簽名內(nèi)容,如果不使用該參數(shù),sign方法返回一個Buffer對象。當sign對象的sign方法被調(diào)用之后,該對象不能再被使用。

示例:使用sign對象對“test”字符串進行簽名,加密算法為RSA-SHA256,私鑰從應用程序根目錄下的key.pem文件中讀出,在數(shù)據(jù)簽名完畢后,在控制臺中輸出數(shù)據(jù)簽名的hex編碼格式字符串。

const crypto = require('crypto');
const fs = require('fs');
let pem = fs.readFileSync('key.pem');
let key = pem.toString('ascii');
let sign = crypto.createSign('RSA-SHA256');
sign.update('test');
console.log(sign.sign(key,'hex'));
812da8dae8ec5b09f010d81c06afd2a3dc766801ea466f46763d31a98d04d7f5f55a2a0e7ef66a60551495ddbfde73c5ffc9d3822257a25195c115d2f41753d9685988653ddb0036adb753f8eff3ea0ec2248c32d5e19824b5d3dc2ed74bbb922b5b5457c243fd25b5399e061def56e788f9a4ec759ff4f764f95d0487954737

4.4、Verify驗簽

  1. 在crypto模塊中,Verify類用于對簽名進行驗證操作。在對簽名進行驗證之前,首先需要創(chuàng)建一個verify對象,可以通過createVerify方法創(chuàng)建verify對象,該方法的使用方式如下所示。
crypto.createVerify(algorithm)
  • algorithm:指定在驗證簽名數(shù)據(jù)時所使用的算法,例如“RSA-SHA256”?,該算法必須與加密該數(shù)據(jù)時所使用的算法保持一致。
  1. 通過使用該對象的update方法來指定需要被驗證的數(shù)據(jù)。該方法的使用方式如下所示
verify.update(data)
  • data:一個Buffer對象或一個字符串,用于指定需要驗證的數(shù)據(jù)??梢允褂枚啻蝩pdate方法來添加需要驗證的數(shù)據(jù)。
  1. 使用verify對象的verify方法來對簽名進行驗證。verify方法的使用方式如下所示
verify.verify(object,signature,[signature_format])
  • object:指定驗證時所使用的對象,參數(shù)值為一個字符串,該字符串值可以為一個RSA公鑰、一個DSA公鑰或一個X.509證書
  • signature:必須為sign對象,用于指定被驗證的簽名
  • signature_format:可選,指定在生成該簽名時所使用的編碼格式,可指定參數(shù)值為“hex”?、?“binary”及“base64”?

示例:

使用sign對象對“test”字符串進行簽名,加密算法為RSA-SHA256,私鑰從應用程序根目錄下的key.pem文件中讀出,在數(shù)據(jù)簽名完畢后,創(chuàng)建一個verify對象,指定驗證數(shù)據(jù)為“test”字符串,使用從應用程序根目錄下的cert.pem公鑰文件中讀取的公鑰進行驗證,最后在控制臺中輸出驗證結(jié)果。

const crypto = require('crypto');
const fs = require('fs');
//私鑰
let privatePem = fs.readFileSync('key.pem');
//包含公鑰的證書
let publicPem = fs.readFileSync('cert.pem');
let key = privatePem.toString();
let pubkey = publicPem.toString();
let data = "test"
let sign = crypto.createSign('RSA-SHA256');
sign.update(data);
//簽名
let sig = sign.sign(key, 'hex');
//驗簽
let verify = crypto.createVerify('RSA-SHA256');
verify.update(data);
console.log(verify.verify(pubkey, sig, 'hex'));
true

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • node中modules.exports與exports導出的區(qū)別

    node中modules.exports與exports導出的區(qū)別

    這篇文章主要介紹了node中modules.exports與exports導出的區(qū)別,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • 基于node.js實現(xiàn)爬蟲的講解

    基于node.js實現(xiàn)爬蟲的講解

    今天小編就為大家分享一篇關(guān)于基于node.js實現(xiàn)爬蟲的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • Node.js如何優(yōu)雅的封裝一個實用函數(shù)的npm包的方法

    Node.js如何優(yōu)雅的封裝一個實用函數(shù)的npm包的方法

    這篇文章主要介紹了Node.js如何優(yōu)雅的封裝一個實用函數(shù)的npm包的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • Koa2微信公眾號開發(fā)之本地開發(fā)調(diào)試環(huán)境搭建

    Koa2微信公眾號開發(fā)之本地開發(fā)調(diào)試環(huán)境搭建

    本篇文章主要介紹了Koa2微信公眾號開發(fā)之本地開發(fā)調(diào)試環(huán)境搭建,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Node.js使用JSONP接口的具體用法

    Node.js使用JSONP接口的具體用法

    JSONP是一個跨域解決方案,本文主要介紹了Node.js使用JSONP接口的具體用法,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2024-03-03
  • node.js中的fs.symlinkSync方法使用說明

    node.js中的fs.symlinkSync方法使用說明

    這篇文章主要介紹了node.js中的fs.symlinkSync方法使用說明,本文介紹了fs.symlinkSync的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • nodejs服務內(nèi)存泄露排查過程和優(yōu)化方法

    nodejs服務內(nèi)存泄露排查過程和優(yōu)化方法

    在開發(fā)和部署Node.js應用程序時,內(nèi)存泄露是一個常見的挑戰(zhàn),本文將探討如何對于一個陌生項目進行內(nèi)存排查和優(yōu)化的方法,文章通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • nodeJS?express路由學習req.body與req.query方法實例詳解

    nodeJS?express路由學習req.body與req.query方法實例詳解

    這篇文章主要為大家介紹了nodeJS?express路由學習req.body與req.query方法實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Node.js中流(stream)的使用方法示例

    Node.js中流(stream)的使用方法示例

    Stream 是一個抽象接口,Node 中有很多對象實現(xiàn)了這個接口。下面這篇文章主要給大家介紹了關(guān)于Node.js中流(stream)的使用方法示例,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-07-07
  • NodeJS實現(xiàn)視頻轉(zhuǎn)碼的示例代碼

    NodeJS實現(xiàn)視頻轉(zhuǎn)碼的示例代碼

    本篇文章主要介紹了NodeJS實現(xiàn)視頻轉(zhuǎn)碼的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11

最新評論

望奎县| 错那县| 江安县| 龙口市| 贡觉县| 徐水县| 调兵山市| 来凤县| 巫溪县| 榕江县| 嘉义县| 迁西县| 哈巴河县| 鸡东县| 石景山区| 互助| 运城市| 永和县| 通渭县| 伊吾县| 承德市| 合阳县| 玛沁县| 巴青县| 天柱县| 徐汇区| 黔南| 江油市| 江都市| 荃湾区| 米脂县| 连州市| 安达市| 营山县| 阿尔山市| 济宁市| 庐江县| 饶河县| 永德县| 桦川县| 三台县|