nodejs加解密

加密分类

可逆加密和不可逆加密
  1. 不可逆加密: 加密后不可解密,只能通过碰撞密文以极小的概率解密;
  2. 可逆加密: 加密后可以解密;包括对称加密非对称加密;
    1. 对称加密双方采用共同密钥;
    2. 非对称加密: 这种加密方式存在两个密钥,密钥-- 一种是公钥,一种是密钥。使用公钥加密,则只能使用密钥解密,使用密钥加密,则只能使用公钥解密;

不可逆加密

    const crypto = require('crypto');

    let str = 'abcd';
    let password = 'hello';
    // 不可逆加密

    // 支持md5/sha1/sha256等加密
    let data1 = crypto.createHash('md5').update(str).digest('hex');
    console.log(data1);

    // 以指定key作为密码进行加密
    let data2 = crypto.createHmac('md5', password).update(str).digest('hex');
    console.log(data2);

可逆加密

对称加解密
    const crypto = require('crypto');
    let str = 'abcd';
    const password = 'FnJL7EDzjqWjcaY9';
    const iv = 'FnJL7EDzjqWjcaY9';
    // 加密
    const cipher = crypto.createCipheriv('aes-128-cbc', password, iv);
    cipher.update(str,'utf8', 'hex')
    let data3 = cipher.final('hex');
    console.log(data3);

    // 解密
    const decipher = crypto.createDecipheriv('aes-128-cbc', password, iv);
    decipher.update(data3, 'hex', 'utf8')
    let data4 = decipher.final().toString();
    console.log(data4);
非对称加解密(基于公钥密钥)
  1. 生成公钥密钥

     openssl genrsa -out server.key
     openssl req -new -key server.key -out server.csr
     openssl x509 -req  -in server.csr -signkey server.key -out server.crt
  2. 验证证书功能

     const crypto = require('crypto');
     const fs = require('fs');
     const sign = crypto.createSign('RSA-SHA256');
     const verify = crypto.createVerify('RSA-SHA256');
     const privateKey = fs.readFileSync('./server.key').toString();      //rsa私钥
     const publicKey = fs.readFileSync('./server.crt').toString();
     const str = 'abcd';
    
     sign.update(str);
     verify.update(str);
    
     let signture = sign.sign(privateKey);
     let result = verify.verify(publicKey, signture);
     console.log(result);         // true/false
  3. 公钥密钥加解密

     const crypto = require('crypto');
     const fs = require('fs');
     const privateKey = fs.readFileSync('./server.key').toString();      //rsa私钥
     const publicKey = fs.readFileSync('./server.crt').toString();
     const str = 'abcd';
    
     // 公钥加密,密钥解密
     const publicEncodeData = crypto.publicEncrypt(publicKey, Buffer.from(str)).toString('base64');
     console.log("encode: ", publicEncodeData);
     const privateDecodeData = crypto.privateDecrypt(privateKey, Buffer.from(publicEncodeData.toString('base64'), 'base64'));
     console.log("decode: ", privateDecodeData.toString())
    
     // 密钥加密,公钥解密
     const privateEncodeData = crypto.privateEncrypt(privateKey, Buffer.from(str)).toString('base64');
     console.log("encode: ", privateEncodeData);
     const publicDecodeData = crypto.publicDecrypt(privateKey, Buffer.from(privateEncodeData.toString('base64'), 'base64'));
     console.log("decode: ", publicDecodeData.toString())

转载于:https://www.cnblogs.com/zhaowinter/p/10825565.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,它使用公钥和私钥来加密和解密数据。在Node.js中,我们可以使用`crypto`模块来实现RSA加密和解密。 首先,我们需要生成RSA密钥对。可以使用以下代码生成一个新的RSA密钥对: ```javascript const crypto = require('crypto'); const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', { modulusLength: 2048, publicKeyEncoding: { type: 'pkcs1', format: 'pem' }, privateKeyEncoding: { type: 'pkcs1', format: 'pem' } }); console.log('公钥:'); console.log(publicKey); console.log('私钥:'); console.log(privateKey); ``` 生成的公钥和私钥将以PEM格式显示。 接下来,我们可以使用生成的公钥进行加密,私钥进行解密。以下是一个示例: ```javascript const crypto = require('crypto'); // 加密 function encrypt(data, publicKey) { const buffer = Buffer.from(data, 'utf8'); const encrypted = crypto.publicEncrypt(publicKey, buffer); return encrypted.toString('base64'); } // 解密 function decrypt(encryptedData, privateKey) { const buffer = Buffer.from(encryptedData, 'base64'); const decrypted = crypto.privateDecrypt(privateKey, buffer); return decrypted.toString('utf8'); } // 使用示例 const plaintext = 'Hello, RSA!'; const encrypted = encrypt(plaintext, publicKey); console.log('加密后的数据:', encrypted); const decrypted = decrypt(encrypted, privateKey); console.log('解密后的数据:', decrypted); ``` 请注意,这只是一个基本示例,实际使用时可能需要处理更复杂的数据和错误处理。 希望这可以帮助到你!如有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值