使用jsencrypt加密和解密进行不对称加密

8,095 阅读1分钟

使用jsencrypt实现不对称加密的思路:

1.生成一个公钥和私钥:前端生成加密密码要使用公钥,后端解密需要私钥;

在node中生成一个公钥和私钥

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中也可以使用