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

使用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"/>
    //在node包中下载jsencrypt,之后引入即可
    <script src="./js/jsencrypt.js"/>
    <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>
</input></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中也可以使用

原文链接:juejin.im

上一篇:extract-hoc
下一篇:Webpack优化实践,合理分包,降低白屏时间👆

相关推荐

  • 通过讲故事的方式让你理解,对称密钥加密,非对称称密钥加密和HTTPS等

    在讲HTTPS之前我们先聊一下密码学的简单知识,因为密码学还是比较复杂的学科,这里就简单的介绍一些概念,但是这些概念对理解HTTPS有很大的帮助。 在密码学中,常用Alice和Bob这两个名字进行举...

    9 个月前
  • 谈一谈使用字体库加密数据-仿58同城

    对于前端同学来说其实做的更多的事情就是把数据整合好,按照UI同学的设计通过后端同学给的数据展示在网页中,这也就导致了很多人认为前端很简单,没有做什么工作也没有什么后端复杂的业务逻辑。

    4 个月前
  • 记一次react项目报文全局加密过程

    前言 在常见前端SAP项目中,浏览器端通过HTTP请求获取数据,这个过程可以通过打开浏览器控制台看到结果, 平时开发过程中也会有通过工具模拟HTTP请求的过程,例如postman等工具,可以通过工...

    4 个月前
  • 视频网页加密播放器方案

    &lt;!-- /\* Font Definitions \*/ @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 ...

    5 个月前
  • 视频加密能实现到期后自动销毁吗?

    在我们印象中,书本上的文字是一直存在的,但也有一种书为了限制观看时间,解决看书拖延的问题,再一定的时间内书上的文字消失掉。早在1992年,美国科幻小说大师威廉·吉布森的诗集《阿古利巴:死亡之书》,以一...

    4 个月前
  • 结合RSA与AES实现前后端加密通信

    一、思路使用RSA秘钥生成工具生成一对公钥(A)和私钥(B),前端保留A,后端保留B。前端发送数据时,先生成一串随机16位字符串作为AES的秘钥(C),然后使用A使用RSA算法对C进行加密,得到加密后...

    5 个月前
  • 玩转混合加密 | 精美配图

    数据加密,是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文。它的核心是密码学。 数据加密仍是计算机系统对信息进行保护的一种最可靠的办法。

    2 个月前
  • 浏览器端rsa加密方案

    并没有体验多少库,只看了一个npm里最多人用的一个库: node-forge : 接口文档 前端代码 // 他们github有提供 forge.min.js , 不用webpack的项目也可以直接引用...

    1 年前
  • 浅析Node.js非对称加密方法

    前言 刚回答了SegmentFault上一个兄弟提的问题《非对称解密出错》。这个属于Node.js在安全上的应用,遇到同样问题的人应该不少,基于回答的问题,这里简单总结下。

    3 年前
  • 某网站高度加密混淆的javascript的分析与破解思路

    对某网站加密混淆后的javascript代码也算分析了一段时间了,虽然还没搞出来,但多少有些心得,这里记录一下。 工具和资料 分析过程 获取javascript代码 加密的核心代码只有一小部分是直接...

    2 年前

官方社区

扫码加入 JavaScript 社区