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";
}
   以上用到的文件,可以在这里下载  这是个人经验所得,有错误欢迎大家指出。
时间: 2024-08-06 07:55:36

springmvc使用RSA算法加密表单的相关文章

Servlet、SPringMVC、Struts等防止表单重复提交的多种处理方法

第一种处理方法(非拦截器): 目前这种方法不建议,因为JSP规范不建议写JAVA代码.这种可以方便第二种处理方法的理解,第二种方法引入拦截器的思想,原理基本一样,模仿Struts的Token机制. 1.在需要防止重复的jsp中加入下面的java代码, <%@page import="java.util.Random"%> <%@page import="java.util.Set"%> <%@page import="java

Servlet、SPringMVC、Struts等防止表单反复提交的多种处理方法

第一种处理方法(非拦截器): 眼下这样的方法不建议,由于JSP规范不建议写JAVA代码.这样的能够方便另外一种处理方法的理解,另外一种方法引入拦截器的思想,原理基本一样,模仿Struts的Token机制. 1.在须要防止反复的jsp中添?以下的java代码, <%@page import="java.util.Random"%> <%@page import="java.util.Set"%> <%@page import="

springmvc文件上传及表单数据封装

补充: form表单需要提交时间,springmvc封装到实体类的Date字段时,丢失时分秒,可以在controller中添加     @InitBinder     public void initBinder(WebDataBinder binder) {         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");         dateFormat.setLenient(f

RSA算法加密解密,数据传输,前台与后台数据交互

1.RSA算法加密解密思路. java后台随机生成公钥.私钥.存储于session中,告知前台js获取公钥.通过jsencrypt.min.js进行加密.传输回后台,后台通过私钥解密. 2.RSA常见异常分解. 问题一 Cannot find any provider supporting RSA 出现此问题,属于JDK版本bug问题,笔者1.8.0_171遇到此问题,更换1.8.0_211之后即可解决. 问题二 DER input, Integer tag error 出现此问题,主要是公钥,

ios下使用RSA算法加密与java后台解密配合demo

首先了解一下几个相关概念,以方便后面遇到的问题的解决: 原网址:http://blog.csdn.net/jinglijun/article/details/7770315RSA算法:1977年由Ron Rivest.Adi Shamirh和LenAdleman发明的,RSA就是取自他们三个人的名字.算法基于一个数论:将两个大素数相乘非常容易,但要对这个乘积的结果进行因式分解却非常困难,因此可以把乘积公开作为公钥.该算法能够抵抗目前已知的所有密码攻击.RSA算法是一种非对称算法,算法需要一对密钥

SpringMVC中的异步提交表单

1.前言 近期在做一个项目,前台框架用的是EasyUI+SpringMVC,因为对SpringMVC不太了解,所以刚開始接触的时候有点吃力,在此通过一个EasyUi中的DataGrid表格来总结一下.  2.SpringMVC中的View向控制器传參 在SpringMVC中,View怎样向控制器传參数呢? 尤其是Form表单提交的时候,详细有例如以下几种方式 2.1 HttpServletRequest 能够通过getParameter()方法来获取前台传过来的參数 2.2 Form表单绑定 /

安全不安全002:C#实现RSA算法加密解密

通过前面的文章我们学会了如何生成公钥和私钥,详见这篇文章:https://blog.csdn.net/yysyangyangyangshan/article/details/80368397.那么,我们来看在C#中如何实现RSA加密解密.直接上代码,如下类是RSA算法实现的加密,加解密,签名以及签名的验证. /// <summary> /// 类名:RSACrypt /// 功能:RSA加密.解密.签名.验签 /// </summary> public sealed class R

RSA算法加密解密

该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1. jar 注意:RSA加密明文最大长度117字节,解密要求密文最大长度为128字节,所以在加密和解密的过程中需要分块进行. RSA加密对明文的长度是有限制的,如果加密数据过大会抛出如下异常: Exception in thread "main" javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes a

12306抢票客户端(1)账户登录Post表单

每次回家坐火车都需要使用软件来抢票,而前段时间爆出了"12306网站密码大规模泄露"的事件.泄露的罪魁祸首就是那些第三方抢票软件!因此,自己写一个抢票软件来抢票,无毒无害,效率更高. 1. 破解登录表单 12306在登录账户时,使用了验证码.加载动态js.查找抢票软件关键词.加密表单内容的反抢票软件措施,因此需要搞清登录表单的每一个值是如何得到的. 登录时,需要向 https://kyfw.12306.cn/otn/login/loginAysnSuggest 这个url发送一个POS