Асимметричное шифрование с шифрованием и дешифрованием jsencrypt

Node.js

Идея использования jsencrypt для реализации асимметричного шифрования:

1. Сгенерируйте открытый ключ и закрытый ключ: внешний интерфейс генерирует зашифрованный пароль с использованием открытого ключа, а для внутренней расшифровки требуется закрытый ключ;

Создайте открытый и закрытый ключ в узле

const NodeRSA = require("node-rsa");
const fs = require("fs")
//生成公钥
function generator() {
    var key = new NodeRSA({ b: 512 })
    key.setOptions({ encryptionScheme: 'pkcs1' })

    var privatePem = key.exportKey('pkcs1-private-pem')
    var publicPem = key.exportKey('pkcs8-public-pem')

    fs.writeFile('./pem/public.pem', publicPem, (err) => {
        if (err) throw err
        console.log('公钥已保存!')
    })
    fs.writeFile('./pem/private.pem', privatePem, (err) => {
        if (err) throw err
        console.log('私钥已保存!')
    })
}
generator();

2. Серверной части необходимо настроить интерфейс, предоставляющий открытый ключ для использования внешней частью:

const fs = require("fs")
app.get("/getPublicKey",(req,res)=>{
    let publicKey = fs.readFileSync('./pem/public.pem', 'utf-8');
    res.send({ 'status': 0, 'msg': '公钥获取成功', 'resultmap': publicKey });
})

3. Внешний интерфейс получает шифрование с открытым ключом и передает его серверной части:

<body>
   <input type="text" name="pwd">
   <button>提交</button>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
    //在node包中下载jsencrypt,之后引入即可
    <script src="./js/jsencrypt.js"></script>
    <script>
        let str = ""
        $.ajax({
            type: "get",
            url: "http://localhost:3030/getPublicKey",
            success: function (response) {
                str = response.resultmap
            }
        });
        
        //使用公钥加密
        function _getPublicKey(password) {
                let encryptor = new JSEncrypt();
                encryptor.setPublicKey(str)
                return encryptor.encrypt(password)
        }
      
      $("button").on("click",function(){
            let pwd = $("[name=pwd]").val();
            //加密后的密码
            let deCode = _getPublicKey(pwd);
            $.ajax({
                type: "post",
                url: "http://localhost:3030/login",
                data: {
                    pwd:deCode
                },
                success: function (response) {
                     console.log(response)
                }
            });
      })
    </script>
</body>

4. Фон получает зашифрованный пароль из базы данных для расшифровки:

//后台利用的是私钥解密,这个是后台解密的方法
let deCode = (password) => {
    const _priKey = fs.readFileSync(path.resolve(__dirname, './pem/private.pem'));
    let jsencrypt = new JSEncrypt()
    jsencrypt.setPrivateKey(_priKey.toString())
    return jsencrypt.decrypt(password)
}

Примечания: это всего лишь краткий обзор использования; внешний интерфейс использует jQuery для тестирования, и его также можно использовать в vue.