• node-rsa公钥私钥加密解密


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

    场景

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

    前端使用公钥加密注册码

    需要下载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>Documenttitle>
        
        <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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    输出结果

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

    注册码用使用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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    输出结果

    生成的注册码 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
  • 相关阅读:
    python基础-enumerate
    【JAVA】我们该如何规避代码中可能出现的错误?(三)
    【设计模式】享元模式的外部状态和内部状态
    Flutter组件--AppBar相关属性
    ASO优化之我们该如何本地化应用
    go语言 rune 类型
    Linux 文本操作指令
    哥斯拉加密WebShell过杀软
    解析:hyperf 官方骨架包的 Dockerfile
    【茫茫架构路】1. Class File字节码文件解析
  • 原文地址:https://blog.csdn.net/qq_42427109/article/details/127793465