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();获得字符串需要反转

 以上用到的文件,可以在这里下载
这是个人经验所得,有错误欢迎大家指出。

转载于:https://www.cnblogs.com/ginponson/p/4518400.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring MVC中,你可以使用@RequestParam注解来获取表单数据。同时,如果你使用Thymeleaf作为模板引擎,你可以在表单使用Thymeleaf的语法来绑定表单数据。 首先,确保你已经在你的Spring MVC配置中配置了Thymeleaf视图解析器。例如,在你的`application.properties`或`application.yml`中添加以下配置: ``` spring.thymeleaf.enabled=true spring.thymeleaf.prefix=classpath:/templates/ spring.thymeleaf.suffix=.html ``` 接下来,在你的Controller中,使用@RequestParam注解来获取表单数据。例如,假设你有一个表单提交了一个名为"name"的字段,你可以这样获取它的值: ```java @PostMapping("/submit") public String handleSubmit(@RequestParam("name") String name) { // 处理表单数据 return "redirect:/success"; } ``` 在上面的例子中,`@RequestParam("name")`表示获取名为"name"的表单字段的值,并将其赋值给`name`变量。 然后,在你的Thymeleaf模板中,你可以使用Thymeleaf的语法来绑定表单数据。例如,如果你想在表单中显示之前提交的名字,可以使用以下代码: ```html <form th:action="@{/submit}" method="post"> <input type="text" name="name" th:value="${name}" /> <button type="submit">Submit</button> </form> ``` 在上面的例子中,`${name}`表示从Controller传递过来的名为"name"的属性值。 这样,你就可以在Spring MVC中获取和使用Thymeleaf表单数据了。希望对你有所帮助!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值