小卒子
NodeJs-Web Crypto API
Node.js中的WebCryptoAPI模块提供了现代的密码学功能,允许开发者使用加密、解密、签名、验证、哈希等功能。该模块基于WebCryptographyAPI标准,因此提供的API与浏览器环境中的类似,具有一致的使用体验。模块引入在Node.js中,你可以通过crypto.webcrypto来访问WebCryptoAPI。使用示例如下:const{webcrypto}=require('crypto');主要属性和方法Node.js的WebCryptoAPI模块包括以下几个主要部分:SubtleCryptoCryptoKeyKeyAlgorithmSupportedAlgorithms随机数生成(getRandomValues)WebCryptoAPI的实际使用示例1.SubtleCryptoSubtleCrypto对象是WebCryptoAPI的核心部分,提供了加密、解密、签名、验证、哈希、密钥生成和导入/导出的功能。可以通过crypto.webcrypto.subtle来访问:constsubtle=webcrypto.subtle;常用方法:encrypt():使用指定的加密算法对数据进行加密。decrypt():使用指定的加密算法对密文进行解密。sign():使用密钥对数据进行签名。verify():验证签名的有效性。digest():计算数据的哈希值。generateKey():生成加密密钥。deriveKey():从基础密钥派生新的密钥。deriveBits():从基础密钥派生位数据。importKey():导入现有密钥材料,生成CryptoKey对象。exportKey():导出密钥材料。wrapKey():使用密钥对另一个密钥进行加密。unwrapKey():解密加密的密钥。2.CryptoKeyCryptoKey对象代表了在WebCryptoAPI中使用的密钥。所有加密操作都依赖于这些密钥对象。CryptoKey可以是对称密钥或非对称密钥对的组成部分(如RSA密钥对中的公钥或私钥)。CryptoKey的常用属性:type:指示密钥是对称密钥(secret)还是非对称密钥对中的公钥(public)或私钥(private)。extractable:指示密钥是否可以导出。algorithm:密钥的算法。usages:密钥的用途,可以是encrypt,decrypt,sign,verify,deriveKey,deriveBits,wrapKey,unwrapKey等。示例://生成AES-GCM对称密钥subtle.generateKey({name:"AES-GCM",length:256,},true,//密钥是否可导出["encrypt","decrypt"]).then(key=>{console.log(key);});3.KeyAlgorithmKeyAlgorithm对象定义了CryptoKey使用的加密算法,具体包括以下几种:AES-GCM:一种支持认证的对称加密算法。AES-CBC:对称加密算法。HMAC:一种基于密钥的哈希消息认证码。RSA-OAEP:使用OptimalAsymmetricEncryptionPadding的非对称加密算法。RSA-PSS:基于ProbabilisticSignatureScheme的非对称签名算法。ECDSA:基于椭圆曲线的数字签名算法。ECDH:基于椭圆曲线的密钥协商算法。不同算法有各自的参数设置,具体取决于算法的类型。4.SupportedAlgorithmsNode.jsWebCryptoAPI支持的主要算法如下:对称加密算法:AES-GCMAES-CBCAES-CTRAES-KW(密钥包裹算法)非对称加密算法:RSA-OAEPRSA-PSS(签名验证)密钥协商算法:ECDH哈希算法:SHA-1SHA-256SHA-384SHA-512消息认证码:HMAC5.getRandomValues()getRandomValues()是一种用于生成随机数的安全方法。它可以生成加密强度的随机数,适用于生成密钥材料或其他密码学相关的数据。使用示例:constarray=newUint8Array(16);webcrypto.getRandomValues(array);console.log(array);在此示例中,getRandomValues会生成一个长度为16的随机字节数组。6.实际使用示例1.数据加密和解密以下是如何使用AES-GCM对称加密算法来加密和解密数据的示例:asyncfunctionencryptData(data,key){constiv=webcrypto.getRandomValues(newUint8Array(12));//初始化向量constencrypted=awaitsubtle.encrypt({name:"AES-GCM",iv:iv,},key,data);return{encrypted,iv};}asyncfunctiondecryptData(encrypted,key,iv){constdecrypted=awaitsubtle.decrypt({name:"AES-GCM",iv:iv,},key,encrypted);returndecrypted;}(async()=>{constkey=awaitsubtle.generateKey({name:"AES-GCM",length:256,},true,["encrypt","decrypt"]);constdata=newTextEncoder().encode("HelloWorld");const{encrypted,iv}=awaitencryptData(data,key);constdecrypted=awaitdecryptData(encrypted,key,iv);console.log(newTextDecoder().decode(decrypted));})();2.哈希数据下面是使用SHA-256算法对数据进行哈希的示例:asyncfunctionhashData(data){consthash=awaitsubtle.digest("SHA-256",data);returnhash;}(async()=>{constdata=newTextEncoder().encode("HelloWorld");consthash=awaithashData(data);console.log(Buffer.from(hash).toString('hex'));})();3.生成和验证数字签名asyncfunctiongenerateKeyPair(){returnawaitsubtle.generateKey({name:"ECDSA",namedCurve:"P-256",//可选"P-384","P-521"},true,["sign","verify"]);}asyncfunctionsignData(data,privateKey){returnawaitsubtle.sign({name:"ECDSA",hash:"SHA-256",},privateKey,data);}asyncfunctionverifySignature(data,signature,publicKey){returnawaitsubtle.verify({name:"ECDSA",hash:"SHA-256",},publicKey,signature,data);}(async()=>{const{publicKey,privateKey}=awaitgenerateKeyPair();constdata=newTextEncoder().encode("HelloWorld");constsignature=awaitsignData(data,privateKey);constisValid=awaitverifySignature(data,signature,publicKey);console.log("Signaturevalid:",isValid);})();总结Node.js的WebCryptoAPI模块提供了强大的现代密码学支持,包括对称加密、非对称加密、哈希、签名验证、密钥派生等功能。通过SubtleCryptoAPI,开发者能够实现安全的数据加密、解密、哈希和签名功能,同时保持与浏览器端API的一致性。这为构建安全应用程序和实现跨平台的密码学操作提供了便捷的解决方案。
nodejs
448
3月前