zoukankan      html  css  js  c++  java
  • Web前端实践:Node-RSA 与 JSEncrypt进行前后端传输加密,sha512密码密文存储

    1 Node-RSA 与 JSEncrypt 实现前端加密后端解密功能

    cnpm install jsencrypt -S

    cnpm install node-rsa -S

    1.1 生成私钥、公钥对

    var  NodeRSA  = require('node-rsa')
     //1.创建RSA对象,并指定 秘钥长度
    var key = new NodeRSA({ b: 512 });
    key.setOptions({ encryptionScheme: 'pkcs1' });//指定加密格式
    
     //2.生成 公钥私钥,使用 pkcs8标准,pem格式
    var publicPem = key.exportKey('pkcs8-public-pem');//制定输出格式
    var privatePem = key.exportKey('pkcs8-private-pem');
    
    console.log('公钥:
    ',publicPem);
    console.log('私钥:
    ', privatePem);
    

    image-20201227204353247

    node-rsa中有对公钥私钥的规定

    image-20201227204959767

    可以看出,我们生成的属于pkcs8,而且导出的方法是pkcs8-private-pem,这个在后面后端解密的时候需要再次用到

    1.2 前端加密

    前端在/js文件夹中准备好了JSEncrypt的代码

    <script src="../js/jsencrypt.min.js"></script>
    

    在页面js中

    var encryptor = new JSEncrypt();
    var pubKey =  `-----BEGIN PUBLIC KEY-----
    MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAI4Sd1JVtIIrHDoMcknO6iva2+iAMPFo
    Jx+dGrjlgvcYdyePwPJft1ZB4WkZb/vRHN8UKn123CV5B2XolmqrDv0CAwEAAQ==
    -----END PUBLIC KEY-----`
    encryptor.setPublicKey(pubKey)
    

    在ajax请求时对数据进行加密

    data: {
    	username:encryptor.encrypt(document.getElementById("username").value) ,
    	password:encryptor.encrypt(document.getElementById("password").value)
    }
    

    1.3 后端解密

    后端使用node-rsa进行解密,需要注意的是,因为jsencrypt自身使用的是pkcs1加密方案, nodejs需要修改成pkcs1。

    var  NodeRSA  = require('node-rsa')
    const priKey ='-----BEGIN PRIVATE KEY-----
    '+
    'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAjhJ3UlW0giscOgxy
    '+
    'Sc7qK9rb6IAw8WgnH50auOWC9xh3J4/A8l+3VkHhaRlv+9Ec3xQqfXbcJXkHZeiW
    '+
    'aqsO/QIDAQABAkBwCF/PrYYKn7RCkk4Npf1DV/LSBUSTGW7An0LTSylbb+HKp73X
    '+
    'QUeALkJ3ranLe3UBiAGXZq4IywuDVSu9I4yBAiEAzoY9O1TRcQt8QdG6wNjB5VQM
    '+
    'zmkTtMzicBEu2JtCu7cCIQCwG31HUw7+emB6eDiiLDor/IoeQxujEZu4tMgXcDky
    '+
    '6wIhAMuT8+P6dgJzCedvsCHNCUTgF0eYuL4ugL9rkLwgQCX9AiAwLYULYyyh78a/
    '+
    'Gm6b5y+O4wrCFqfT57hLQqHOz7PGOwIgPN0W26+BrhXIaazkCEf0/qz95cwHEdgl
    '+
    'Sc6Jev4DrBw=
    '+
    '-----END PRIVATE KEY-----'
    var decrypt = new NodeRSA(priKey,'pkcs8-private-pem')
    decrypt.setOptions({ encryptionScheme: 'pkcs1' }) 
    

    在接受请求时,对数据进行解密,并尝试进行解密

    app.post("/register",function(req,res){
    	 var name = decrypt.decrypt(req.body.username,'utf-8');
        var psw = decrypt.decrypt(req.body.password,'utf-8');
        console.log("name "+name+' psw '+psw);
        ...
     }
    

    1.4 效果

    可以看到,前端发出的请求被加密

    image-20201227205615628

    而后端经过解密后,得到了正确的数据

    image-20201227205642565

    参考链接:

    前端利用jsencrypt.js进行RSA加密https://www.jianshu.com/p/5008a407b558

    nodejs RSA 与 jsencrypt实现前端加密后端解密功能https://blog.csdn.net/weixin_34037515/article/details/92411973

    前端加解密方案探讨https://www.cnblogs.com/wonyun/p/10164364.html

    2 sha512数据存储加密

    在存储到数据库的时候,也需要进行加密,而不应该明文存储,这里选择了使用sha512进行加密

    cnpm install js-sha512 --save

    这里使用了用户名作为加盐值

    var sha512 = require('js-sha512');
    var sha = sha512(name+psw);
    var myobj = { 'name': name, 'password': sha };
    ...
    userdb.insertOne(myobj);
    

    可以看到,经过处理后的数据库密码使用了密文存储

    image-20201227210041472

  • 相关阅读:
    Servant:基于Web的IIS管理工具
    mono-3.4.0 源码安装时出现的问题 [do-install] Error 2 [install-pcl-targets] Error 1 解决方法
    使用 OWIN Self-Host ASP.NET Web API 2
    Xamarin和微软发起.NET基金会
    SQLite vs MySQL vs PostgreSQL:关系型数据库比较
    Mono 3.2.7发布,JIT和GC进一步改进
    如何使用Microsoft技术栈
    c#开源消息队列中间件EQueue 教程
    通过一组RESTful API暴露CQRS系统功能
    NEsper Nuget包
  • 原文地址:https://www.cnblogs.com/cpaulyz/p/14199535.html
Copyright © 2011-2022 走看看