springmvc使用RSA算法加密表单
今天被吐槽在客户端用js对密码进行md5加密其实也不见得安全。这种做法其实不见得有什么作用,学过计算机网络都知道,在网上抓一个包是很简单的事,就算别人抓包抓不到你原始密码,用这个md5后的密码一样可以模拟登录系统。这样做无非就是直接通过登录页没法直接输入用户名密码,但用个程序模拟登陆也不是什么太难的事情。以前一直写那么多,一直没有注意,直到今天被吐槽,才发现以前自己的做法是多么的幼稚。
加密数据的方式当然不止一种,也可以通过https加密数据,但是对于一般应用来说,还需要花钱拿去给那些认证机构签名,反正我是不会干的,企业需要就另说。让认证机构签名了还不行,还需要让用户安装证书,这么麻烦的事,用户不一定要浏览你的网页的时候,你的网页就失去了一个展示的机会,而且毕竟不是所有用户都有那么高的计算机操作水平。
使用RSA非对称加密算法最适合我了,又不用钱,又比较安全。对称加密也许大家都已经很熟悉,也就是加密和解密用的都是同样的密钥,没有密钥,就无法解密,这是对称加密。而非对称加密算法中,加密所用的密钥和解密所用的密钥是不相同的:你使用我的公钥加密,我使用我的私钥来解密;如果你不使用我的公钥加密,那我无法解密;如果我没有私钥,我也没法解密。
使用RSA的一个大概流程:
1、浏览器发起登陆请求
2、服务器响应请求,生成RSA公钥和私钥,并将公钥返回浏览器
3、用户输入密码后,用公钥对密码加密
4、将加密的密码提交到服务器
5、使用私钥解密密码

使用RSA算法的主要注意事项大概有:
1、加入security.js的js文件,和加入一个bcprov-jdk16-1.45.jar的包
2、前端
<script src="<c:url value="/js/security.js"/>" type="text/javascript" ></script>
<script type="text/javascript">
function cmdEncrypt(form) {
RSAUtils.setMaxDigits(200);
var key = new RSAUtils.getKeyPair("${pubexponent}", "", "${pubmodules}");
var encrypedPwd = RSAUtils.encryptedString(key,form.password.value);
form.password.value = encrypedPwd;
form.submit();
return true;
}
</script>
3、服务器
@RequestMapping(value="/login",method=RequestMethod.GET)
public String login(Model model,HttpServletRequest request) throws Exception{
KeyPair kp = RSAUtil.generateKeyPair();
RSAPublicKey pubk = (RSAPublicKey) kp.getPublic();//生成公钥
RSAPrivateKey prik= (RSAPrivateKey) kp.getPrivate();//生成私钥
String publicKeyExponent = pubk.getPublicExponent().toString(16);//16进制
String publicKeyModulus = pubk.getModulus().toString(16);//16进制
model.addAttribute("pubexponent", publicKeyExponent);//保存公钥指数
model.addAttribute("pubmodules", publicKeyModulus);//保存公钥系数
request.getSession().setAttribute("prik", prik);
return "login";
}
@RequestMapping(value="/login",method=RequestMethod.POST)
public String login( LoginModel lm,HttpServletRequest request,Model model) throws Exception{
RSAPrivateKey prik = (RSAPrivateKey)request.getSession().getAttribute("prik");
StringBuilder pwd = new StringBuilder();
pwd.append(RSAUtil.decryptByPrivateKey(lm.getPassword().toUpperCase(), prik)).reverse();//反转获得的字符串
List<User> users = userService.getByLoginName(lm.getLoginName(),pwd.toString());
model.addAttribute("user", users.get(0));
return "redirect:/home/main";
}
4、在这几个过程需要注意的是:
1)、pwd.append(RSAUtil.decryptByPrivateKey(lm.getPassword().toUpperCase(), prik)).reverse();获得字符串需要反转
以上用到的文件,可以在这里下载
这是个人经验所得,有错误欢迎大家指出。
springmvc使用RSA算法加密表单的更多相关文章
- SpringMVC的form:form表单的使用
为什么要使用SpringMVC的form:form表单,有两个原因:一是可以更加快捷的完成表单的开发,比如会替你做好数据类型装换等本来需要你自己动手的工作.其次就是能够更加方便的实现表单回显. 首先要 ...
- Java中使用RSA算法加密
Java中使用RSA算法加密 概述 RSA加密算法是一种非对称加密算法 RSA加密的方式 使用公钥加密的数据,利用私钥进行解密 使用私钥加密的数据,利用公钥进行解密 RSA是一对密钥.分别是公钥和私钥 ...
- Servlet、SPringMVC、Struts等防止表单反复提交的多种处理方法
第一种处理方法(非拦截器): 眼下这样的方法不建议,由于JSP规范不建议写JAVA代码.这样的能够方便另外一种处理方法的理解,另外一种方法引入拦截器的思想,原理基本一样,模仿Struts的Token机 ...
- SpringMVC中的异步提交表单
1.前言 近期在做一个项目,前台框架用的是EasyUI+SpringMVC,因为对SpringMVC不太了解,所以刚開始接触的时候有点吃力,在此通过一个EasyUi中的DataGrid表格来总结一下. ...
- springmvc+ztree v3实现类似表单回显功能
在做权限管理系统时,可能会用到插件zTree v3,这是一个功能丰富强大的前端插件,应用很广泛,如异步加载菜单制作.下拉选择.权限分配等.在集成SpringMVC中,我分别实现了zTree的添删改查, ...
- .NET Core 使用RSA算法 加密/解密/签名/验证签名
前言 前不久移植了支付宝官方的SDK,以适用ASP.NET Core使用支付宝支付,但是最近有好几位用户反应在Linux下使用会出错,调试发现是RSA加密的错误,下面具体讲一讲. RSA在.NET C ...
- Java框架之SpringMVC 04-视图解析-Spring表单-JSON-上传下载
SpringMVC 视图解析 请求处理方法(controller方法)执行完成后,最终返回一个 ModelAndView 对象,即使出现异常也会返回一个 ModelAndView 对象.对于那些返回 ...
- 学习SpringMVC必知必会(7)~springmvc的数据校验、表单标签、文件上传和下载
输入校验是 Web 开发任务之一,在 SpringMVC 中有两种方式可以实现,分别是使用 Spring 自带的验证 框架和使用 JSR 303 实现, 也称之为 spring-validator 和 ...
- RSA算法加密解密
该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1. jar 注意:RSA加密明文最大长度117字节,解密要求密文最大长度为128字节,所以在加密和解密的过程中需要分块 ...
随机推荐
- oracle批量update 转
需求: 将t2(t_statbuf)表中id和t1(T_Mt)表相同的记录更新进t1表. 1.错误的写法: update table_name t1 set (a,b,c)=( select a,b, ...
- node基础06:回调函数
1.Node异步编程 Node.js 异步编程的直接体现就是回调. 异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了. 回调函数在完成任务后就会被调用,Node 使用了大量的回调函数,No ...
- Caffe学习系列(2):数据层及参数
要运行caffe,需要先创建一个模型(model),如比较常用的Lenet,Alex等, 而一个模型由多个屋(layer)构成,每一屋又由许多参数组成.所有的参数都定义在caffe.proto这个文件 ...
- 2015-2016-2 《Java程序设计》项目小组博客
2015-2016-2 <Java程序设计>项目小组博客 1451 完+美 java项目 守望先疯 JavaGroup 07_10_20_22 FromBottomToTop L.G.Su ...
- Web Worker 是什么鬼?
前言 前端工程师们一定有过这样的体验,当一个页面加载了大量的 js 文件时,用户界面可能会短暂地"冻结".这很好理解,因为 js 是单线程的语言.我们再走的极端点,一段 js 中出 ...
- web安全——数据库(mysql)
简介 数据安全是现在互联网安全非常重要一个环节.而且一旦数据出现问题是不可逆的,甚至是灾难性的. 有一些防护措施应该在前面几个博文说过了,就不再赘述.比如通过防火墙控制,通过系统的用户控制,通过web ...
- Scala入门之函数
/** * 函数可以被简单的被认为是包裹了一条或者几条语句的代码体,该代码体接收若干参数,经过代码体处理后返回结果,形如数学中的f(x) = x + 1 * 在Scala中函数式一等公民,可以向变量一 ...
- 处理Linux下subversion尝试连接自建的VisualSVN server报“Key usage violation in certificate has been detected”错误的问题
在Linux下使用subversion尝试链接VisualSVN server搭建的svn库,可能会报下面错误, svn: OPTIONS of 'https://server.domain.loca ...
- jquery 使用方法(转)
原文: http://www.cnblogs.com/Chenfengtao/archive/2012/01/12/2320490.html jQuery是目前使用最广泛的javascript函数库. ...
- 简单Ztree的实现————不连接数据库版
Ztree可以去官网去下载相应的版本和API,我这里就简单的介绍下它的实现以及因为Ztree的小例子印发的Js问题,稍后我会在博客中写JS的异步问题, 我这里用的是MVC4.0,好了正文开始,上代码 ...