node-rsa公钥私钥加密解密

46 篇文章 0 订阅
13 篇文章 0 订阅

ㅤㅤㅤ
ㅤㅤㅤ
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ(要知道对好事的称颂过于夸大,也会招来人们的反感轻蔑和嫉妒。——培根)
ㅤㅤㅤ
ㅤㅤㅤ
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ在这里插入图片描述

场景

用户注册系统的前提是要拥有注册码,但注册码是一个绝对私密的文本,所以需要对存储结果和传输过程进行加密

前端使用公钥加密注册码

需要下载npm jsencrypt

<!DOCTYPE html>
<html lang="en">

  <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- npm i jsencrypt-->
    <script src="node_modules/jsencrypt/bin/jsencrypt.js"></script>
    <script type="text/javascript">
      // 后端返回值
      const nodeRes = {
        "code": 200,
        "success": true,
        "message": "ok!",
        "data": {
          "publicPem": "LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FDWXJ6QWw5MnNVWjJVZkdHTXN0QzVXeS9qTQpqWVNVc01zSEpnM3JuWFdDL0VQM0tvY0VRNGJEVGdaU2FHdHVzQzFWYjU3bVZmZWRtYUhGVTVKRHF6UEVVaEJTCk5YREt6VjFKMFpBNHdRWE1GcHlVVmxha0tnT3UwU3puc0VnUXkzWCtOSWplOEZlZWJZMU5QdzBMTml4STZYZ0cKTVBaaUttNElZcEZuWjQ5R0V3SURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ=="
        }
      };
      // 用户输入的注册码明文
      const registerCode = '216aa7a598a32248a63741651be5c9ee';
      // base64解密
      const publicPem = atob(nodeRes.data.publicPem);
      console.log('解密后的公钥', publicPem);
      // 实例化JSEncrypt对象
      const encrypt = new JSEncrypt();
      // 设置公钥
      encrypt.setPublicKey(publicPem);
      // 公钥加密注册码
      const encCode = encrypt.encrypt(registerCode);
      console.log('公钥加密后的注册码', encCode);
    </script>
  </head>

  <body>

  </body>

</html>

输出结果

解密后的公钥 -----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCYrzAl92sUZ2UfGGMstC5Wy/jM
jYSUsMsHJg3rnXWC/EP3KocEQ4bDTgZSaGtusC1Vb57mVfedmaHFU5JDqzPEUhBS
NXDKzV1J0ZA4wQXMFpyUVlakKgOu0SznsEgQy3X+NIje8FeebY1NPw0LNixI6XgG
MPZiKm4IYpFnZ49GEwIDAQAB
-----END PUBLIC KEY-----
公钥加密后的注册码 Vd4e5n0GBZj/hLrg//WJ2z8nSoU9gfBiSJ7oJxeYH6pA7xDPtzDvkowtMzjIVV5uJ27QSA19TPlToK1NKlMBni9/6JPu9A+t8hjOUY8YfKknZ0bfenaqjcAPuSO8Ai60IW/CfzkLAn/FDYmAWvlfoxu1COuSlf7sAAXMO5ZTqnY=
后端使用私钥解密,再加密存储

注册码用使用md5加密,账户作为key,时间戳作为密钥进行加密存储
校验使用rsa公钥加密,私钥解密的方式

const cryptoJs = require('crypto-js');
const NodeRSA = require('node-rsa');

// 租户id
const accountID = '619b07312d6b99e1af7d8e4e';

// 注册码生成
const code = cryptoJs.HmacMD5(accountID, new Date().valueOf().toString()).toString();
console.log('生成的注册码', code);

// 生成公钥私钥
const key = new NodeRSA({ b: 1024 });
key.setOptions({ encryptionScheme: 'pkcs1' });//指定加密格式

// 生成 公钥私钥,使用 pkcs8标准,pem格式
var publicPem = key.exportKey('pkcs8-public-pem');//制定输出格式
var privatePem = key.exportKey('pkcs8-private-pem');
//console.log(key.$options);
console.log('公钥:\n', publicPem);
console.log('私钥:\n', privatePem);

// 前端公钥加密 前端可以使用jsencrypt加密
const publickKey = new NodeRSA(publicPem, { encryptionScheme: 'pkcs1' });
const encCode = publickKey.encrypt(code, 'base64');
console.log('公钥加密后', encCode);

// 服务端私钥解密
const privateKey = new NodeRSA(privatePem, { encryptionScheme: 'pkcs1' });
const decCode = privateKey.decrypt(encCode, 'utf8');
console.log('私钥解密后', decCode);

输出结果

生成的注册码 f1bff9f3303bb45a66b5855460c24605
公钥:
 -----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCEmKZY2LCkHETugknC4arNi4Dn
NCo/b+559qLTBd2dhcIs24PWrVC6SHSxm7zadTmg4HAJmPlzMIlyaeI+aEAl69so
hVex5pDG5d+TgDHvo5iFegneZ1EJmsUYkx9MO3ibC3QFtPVfFCWIYvNWRScqp+4/
pk+LrS5YT1eGE6tpXQIDAQAB
-----END PUBLIC KEY-----
私钥:
 -----BEGIN PRIVATE KEY-----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAISYpljYsKQcRO6C
ScLhqs2LgOc0Kj9v7nn2otMF3Z2Fwizbg9atULpIdLGbvNp1OaDgcAmY+XMwiXJp
4j5oQCXr2yiFV7HmkMbl35OAMe+jmIV6Cd5nUQmaxRiTH0w7eJsLdAW09V8UJYhi
81ZFJyqn7j+mT4utLlhPV4YTq2ldAgMBAAECgYBBe9n7Wtix07w/Rl0DP8vIwzKf
/GU4+yB9X06+hNET8HEbEjYkGWga95mZ9V3pTaduSilKtB/NwZS/yocPZxD2cmDR
yJb2LXw33Dwoe2p8vBeBcJL9K6CXKCXo83Y0XuBZKK41ZXuwzALEfeRlK87MDoZS
kAZ5N4E0pvBu7r+jwQJBAM02M2njv4OX9I4o/XrzswDCWSG/Z4jrV9zxj0/Skh3h
ji8QoPlfIHZ/lAkKiRQecHUliJnl1tdpZMWrWuVjDJUCQQClaa6fRG+jcoXeokjT
qJJKsNwYF/zZ9DfJVYtfLfnfqyPipExr2aW+INVC8urVugdOTmS1HXbnTzFjookv
Je+pAkB0R0UEuC8Zkq3ZK7LNy27ffEBjFgDFnYzwvdOVyFxRIDCfzI1aICPV4V5x
bQ3VX5YbWwQ3J/v/nVGji//6QJCtAkEAh7afqNizZ7zsjO9FJTNnY5Sb38C+mew/
YRaolNzZ6GM3vBnlAY++5rF1h8paViSdHeg/xEF6bumQshiGyYIskQJBAMKDC8/g
iTsCbXXvGzYIOaEpiJNBvNELXq0ihMt87oVAhwTn/27AWt4w0IVb+S6RlHWgin6W
Fp508vI/iJBD1pI=
-----END PRIVATE KEY-----
公钥加密后 Q2j2bzi636AGL0OeFfLkVtT7Xo73CfVTWqdNmRRLPz5061laE626DFawal6ppY/IeA7XDNL8H2DhM7YcOBiYPItbiJB0Gn0H6q9doddNm23QSSe/nNs33K/Q4s+Cop6VMhUChf2dfGZAFO0VXCP6yPi3O4efY5crEbEv8DuwUoA=
私钥解密后 f1bff9f3303bb45a66b5855460c24605
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值