Node.js之crypto加密模塊使用及說明
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、散列算法
- 在Node.js中,為了使用散列算法,首先應該使用createHash方法創(chuàng)建一個hash對象。createHash方法的使用方式如下所示。
crypto.createHash(algorithm)
algorithm:一個在Node.js中可以使用的算法,例如’sha1’、‘md5’、‘sha256’、'sha512’和’ripemd160’等
- 在創(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對象。
- 可以使用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é)合在一起,以阻止對簽名完整性的破壞。
- 在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
- 在創(chuàng)建了一個hmac對象后,可以通過使用該對象的update方法來創(chuàng)建一個摘要。該方法的使用方式如下所示(代碼中的hmac代表一個hmac對象)?。
hmac.update(data)
data:一個Buffer對象或一個字符串,用于指定摘要內(nèi)容??梢栽谡惠敵銮笆褂枚啻蝩pdate方法來添加摘要內(nèi)容。
- 可以使用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ù)
- 在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ù)以及加密時所使用的密碼泄漏。
- 在創(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對象中。
- 使用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解密
- 在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ù)時所使用的初始向量保持一致。
- 在創(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對象。
- 使用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)絡的傳輸過程中未被修改。
- 在Node.js中,在進行簽名操作之前,首先需要使用createSign方法創(chuàng)建一個sign對象,該方法的使用方式如下所示。
crypto.createSign(algorithm)
algorithm:指定在加密該數(shù)據(jù)時所使用的算法,例如“RSA-SHA256”?。
- 在創(chuàng)建了一個sign對象后,可以通過使用該對象的update方法來指定需要被加密的數(shù)據(jù)。該方法的使用方式如下所示
sign.update(data)
data:一個Buffer對象或一個字符串,用于指定需要被加密的數(shù)據(jù)。可以在對數(shù)據(jù)進行簽名前使用多次update方法來添加數(shù)據(jù)。
- 使用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驗簽
- 在crypto模塊中,Verify類用于對簽名進行驗證操作。在對簽名進行驗證之前,首先需要創(chuàng)建一個verify對象,可以通過createVerify方法創(chuàng)建verify對象,該方法的使用方式如下所示。
crypto.createVerify(algorithm)
algorithm:指定在驗證簽名數(shù)據(jù)時所使用的算法,例如“RSA-SHA256”?,該算法必須與加密該數(shù)據(jù)時所使用的算法保持一致。
- 通過使用該對象的update方法來指定需要被驗證的數(shù)據(jù)。該方法的使用方式如下所示
verify.update(data)
data:一個Buffer對象或一個字符串,用于指定需要驗證的數(shù)據(jù)??梢允褂枚啻蝩pdate方法來添加需要驗證的數(shù)據(jù)。
- 使用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ū)別,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06
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)境搭建,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05
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方法實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09
NodeJS實現(xiàn)視頻轉(zhuǎn)碼的示例代碼
本篇文章主要介紹了NodeJS實現(xiàn)視頻轉(zhuǎn)碼的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11

