当前位置: 首页 > news >正文

Java Web 登录采用非对称加密(RSA算法)

为什么80%的码农都做不了架构师?>>>   hot3.png

登录时采用md5或者base64神马的加密都是不可靠的,被抓包了还是可以模拟登录的,基本没啥用,只能说好过没有...

接下来跟大家介绍下如何采用非对称加密,非对称加密的过程其实就是和https加密原理一样,我的处理过程是这样:

a. 在登录页面生成公钥和私钥,将私钥存在sesion中

b.公钥用于前端页面对数据进行加密

c.将数据传输给后台,后台从session中拿到私钥,然后对数据进行解密,把session中的私钥删除

下面简单记录下实现过程,具体的工具类RSAUtils.java的实现不在这里细说。


1、在JSP中生成公钥和私钥,将公钥放在session中:

HashMap<String, Object> map = RSAUtils.getKeys();
   //生成公钥和私钥  
   RSAPublicKey publicKey = (RSAPublicKey) map.get("public");
   RSAPrivateKey privateKey = (RSAPrivateKey) map.get("private");
 //私钥保存在session中,用于解密
   session.setAttribute("privateKey", privateKey);
   //公钥信息保存在页面,用于加密
   String publicKeyExponent = publicKey.getPublicExponent().toString(16);
   String publicKeyModulus = publicKey.getModulus().toString(16);
   request.setAttribute("publicKeyExponent", publicKeyExponent);
   request.setAttribute("publicKeyModulus", publicKeyModulus);

2、对数据进行加密,用到的前端js工具封装在RSA.js中,需引入到页面。

RSAUtils.setMaxDigits(200);
   var key = new RSAUtils.getKeyPair("${publicKeyExponent}", "", "${publicKeyModulus}");
   var encrypedPwd = RSAUtils.encryptedString(key,orgPwd.split("").reverse().join(""));
其中,orgPwd为原始数据,这里是我的密码。


3、后台对接收到的数据进行解密。

String password=request.getParameter("password");
<span style="white-space:pre">	</span>RSAPrivateKey privateKey = (RSAPrivateKey)request.getSession().getAttribute("privateKey");
			if(privateKey!=null){
				long time1 = System.currentTimeMillis();
				password = RSAUtils.decryptByPrivateKey(password, privateKey);
				log.info("decrypt cost time:"+(Double)((System.currentTimeMillis()-time1)/1000d) +"s");
				request.getSession().removeAttribute("privateKey");
			}


特别注意事项:RSAUtils.java中用到org.bouncycastle.jce.provider.BouncyCastleProvider,部署在服务器上时需做如下两项配置:

a. 修改jdk目录下的 /jre/lib/security/java.security,增加如下配置:


b. 放bcprov-jdk16-146.jar 到 jdk目录下的/jre/lib/ext 下。

在eclipse中开发调试倒是不需要,但部署上服务器时需要,切记!


附件:

1. RSA.js http://pan.baidu.com/s/1ntr99LR

2.RSAUtils.java http://pan.baidu.com/s/1o6l1Wnw

3.bcprov-jdk16-146.jar http://pan.baidu.com/s/1i3EIw0P




版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://my.oschina.net/chaun/blog/519105

相关文章:

  • DAG 的最短路径算法
  • 推荐一个c++小巧开源且跨平台的图像解码库
  • WDS+MDT部署Windows7操作系统2—;导入启动映像和安装映像
  • 机器学习之一:初认识
  • 10月Web服务器份额:排名不变 仅Apache份额下降
  • AndroidVideoPlayer在线播放视频
  • 谈 DevOps 自动化时,也应该考虑到 SOX 等法案
  • 2015年你需要学习的15种编程语言
  • ios 瀑布流
  • rsync杂谈
  • 能者无所不能,身体力行,大道可及
  • 打造立体安保方案 瑞星防毒墙为陕西省人民检察院保驾护航
  • Hadoop作业引用第三方jar文件
  • 电商搜索引擎的架构设计和性能优化
  • CTP报单状态 OrderStatus全部状态
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Apache Spark Streaming 使用实例
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Javascript 原型链
  • Logstash 参考指南(目录)
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • python3 使用 asyncio 代替线程
  • Redis 中的布隆过滤器
  • SOFAMosn配置模型
  • 创建一个Struts2项目maven 方式
  • 大主子表关联的性能优化方法
  • 对象管理器(defineProperty)学习笔记
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 使用SAX解析XML
  • 写代码的正确姿势
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • $forceUpdate()函数
  • %@ page import=%的用法
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (WSI分类)WSI分类文献小综述 2024
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (论文阅读40-45)图像描述1
  • (原)Matlab的svmtrain和svmclassify
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)setTimeout 和 setInterval 的区别
  • (轉貼) UML中文FAQ (OO) (UML)
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .bat批处理出现中文乱码的情况
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • @Autowired @Resource @Qualifier的区别
  • [51nod1610]路径计数
  • [52PJ] Java面向对象笔记(转自52 1510988116)
  • [Android Studio 权威教程]断点调试和高级调试
  • [Android] Upload package to device fails #2720
  • [Android]竖直滑动选择器WheelView的实现