NodeJs简明教程将从零开始学习NodeJs相关知识,帮助JS开发者搭建全栈开发技术栈!本文是NodeJs简明教程的第六部分,将介绍NodeJscrypto模块相关的基本操作。crypto模块提供密码功能,包括完整的OpenSSL散列、HMAC、加密、解密、签名和验证功能包。HashHash类是创建数据哈希值的工具类。严格来说,哈希算法不是加密算法。传统意义上的加密与解密配对。哈希算法可以保证哈希后的内容不被篡改。可以为任意长度的输入数据生成一个固定位数的散列值。crypto模块对hash的操作是一致的,除了算法名称不一致,本文以md5和sha1为例。MD5constcrypto=require('crypto');consthash=crypto.createHash('md5');//创建MD5哈希示例hash.update('111111');//要散列的数据console.log(hash.digest('hex'));上述程序的输出是96e79218965eb72c92a549dd5a330112SHA1constcrypto=require('crypto');consthash=crypto.createHash('sha1');//创建MD5哈希示例hash.update('111111');//待哈希的数据console.log(hash.digest('hex'));上述例程的输出为3d4f2bf07dc1be38b20cd6e46949a1071f9d0e3dBase64Base64不是crypto模块的成员,但与本节内容类似,故在此收录。Base64是一组编码算法,常用于二进制数据编码。Base64编码constdata='111111';constencodedData=Buffer.from(data,'utf8').toString('base64');//输入编码为utf8,输出为base64console.log(encodedData);以上例程输出MTExMTExBase64解码constdata='MTExMTEx';constdecodedData=Buffer.from(data,'base64').toString('utf8');//输入编码为base64,输出编码为utf8console.log(decodedData);上述例程输出111111HmacHmac类是用于创建加密Hmac摘要的工具。Hmac算法也是一种散列算法,但是需要密钥。对于相同的输入,传统哈希算法的输出是固定的。但是Hmac的输出会随着key的不同而不同。constcrypto=require('crypto');consthmac=crypto.createHmac('sha256','secret-key');hmac.update('Hello,world!');console.log(hmac.digest('十六进制'));以上例程输出f4d850b1017eb4e20e0c58443919033c90cc9f4fe889b4d6b4572a4a0ec2d08aAESAES是常用的对称加密算法,加密和解密使用相同的密钥。AES加密constcrypto=require('crypto');constcipher=crypto.createCipheriv('aes192','11111111111111111111111','1111111111111111')varcrypted=cipher.update('1','utf8','hex');加密+=cipher.final('hex');控制台日志(加密);上述例程的输出为5bb3e6eb39e502b5fa74d93796087efa说明:createCipheriv的原型如下:crypto.createCipheriv(algorithm,key,iv[,options])iv为初始化向量,key可以为空或16字节的字符串key是加密密钥。根据所选算法的不同,密钥长度也不同。对应关系如下:aes128对应一个16位的密钥aes192对应一个24位的秘钥aes256对应一个32位的密钥长度加密AES解密constcrypto=require('crypto');constcipher=crypto.createDecipheriv('aes192','111111111111111111111111','1111111111111111')vardata=cipher.update('5bb3e6eb39e502b5fa74d93796087efa','hex','utf8');//输入数据编码为hex(十六进制),输出为utf8data+=cipher.final('utf8');console.log(data);上述例程输出1crypto.createDecipheriv方法原型和密码。createCipher也是一样,这里就不赘述了。RSARSA算法是一种非对称加密算法,即由私钥和公钥组成的密钥对,用私钥加密用公钥解密,或者用公钥加密用私钥解密钥匙。其中,公钥可以公开,私钥必须保密。在使用RSA算法生成密钥对之前,必须提供密钥对。本文使用openssl命令生成。opensslgenrsa-outprivate.pem2048生成一个2048位的私钥opensslrsa-inprivate.pem-pubout-outpublic.pem导出公钥,这样在当前目录下我们得到private.pem和public.pemRSA加密const加密=要求('加密');constfs=require('fs');constprivateKey=fs.readFileSync('./private.pem',{encoding:'utf8'});constencodedData=crypto.privateEncrypt(privateKey,Buffer.from('111111','utf8'));//传入utf8编码的数据console.log(encodedData.toString('hex'));以上例程输出44a1b50b9639e4cbe17d55ca57dcb041387acadae3d3721fd9803a3a33091a36d59977feaa6caad990e58b9542c26297de6014e20819f0a71eadd0793bfe0fac834f30d2a05f8b329a3b2409e9f8b7fbd7de3734ada00228b84027568be58a2a34ccf0c4a8b2d02c58eef510931423ed5f40c696361b606df11609248b271aebcd17f9a113f98a8fa86c9c45bd609256f4779ce01ea3027171fffb35e695f1c38553aecafb72a2f46a9012246fde0f2934eacba8932bca38e228f4f4294873ed75d9acf79ab854897ebaab2375384b2da682c1b2e2b49b0592929067b3d5a11971d912629a178691345f7f88137343588b5c51d60643e5c00998484727b8c4a8RSA解密constcrypto=require('crypto');constfs=require('fs');constpublicKey=fs.readFileSync('./public.pem',{encoding:'utf8'});constencodedData='44a1b50b9639e4cbe17d55ca57dcb041387acadae3d3721fd9803a3a33091a36d59977feaa6caad990e58b9542c26297de6014e20819f0a71eadd0793bfe0fac834f30d2a05f8b329a3b2409e9f8b7fbd7de3734ada00228b84027568be58a2a34ccf0c4a8b2d02c58eef510931423ed5f40c696361b606df11609248b271aebcd17f9a113f98a8fa86c9c45bd609256f4779ce01ea3027171fffb35e695f1c38553aecafb72a2f46a9012246fde0f2934eacba8932bca38e228f4f4294873ed75d9acf79ab854897ebaab2375384b2da682c1b2e2b49b0592929067b3d5a11971d912629a178691345f7f88137343588b5c51d60643e5c00998484727b8c4a8';constrawData=crypto.publicDecrypt(publicKey,Buffer.from(encodedData,'hex'));//传入hex(十六进制)数据console.log(rawData.toString('utf8'));上面的例程输出111111结束语常用的加解密、散列、编解码的用法介绍完毕。阅读后如有任何疑问,欢迎加入微信群讨论或关注公众号获取本系列持续更新:
