原文:http://blog.csdn.net/peterwanghao/article/details/43303807

在普通的页面提交时,如果没有使用SSL,提交的数据将使用纯文本的方式发送。如果使用抓包工具可以轻易地截获一些关键数据。

jCryption是一个jQuery插件,能够加密由Forms提交的POST/GET数据。官网地址:http://www.jcryption.org/

未加密处理的效果如下:可很容易地看到登录时的用户名和口令。

使用jCryption后效果如下,提交的数据为密文。

本例中服务端使用Java进行解密,使用了一个开源项目JavaCription,官网地址:https://jcryptionforjava.wordpress.com/。实现了针对jCryption2.0的Java解密。

处理机制如下:

1、客户端从服务端请求一个RSA公钥

2、客户端产生一个随机数作为AES密钥,用RSA公钥进行加密,发送到服务端

3、服务端用RSA私钥进行解密,同时将AES密钥保持到会话中

4、服务端用AES算法加密AES密钥并送回给客户端

5、客户端用AES算法解密,并与本地保存的AES密钥做比对,如果相符就认为服务端是合法的

6、客户端提交数据,数据用AES密钥进行加密

在此版本里为提供效率,只使用RSA非对称算法进行密钥交换,数据的加解密使用AES对称算法。

客户端

引入两个js文件

<script type="text/JavaScript" src="js/jquery-2.1.3.min.js"></script>
<script type="text/javascript" src="js/jquery.jcryption.js"></script>

表单加密,设定两个地址:1)获取公钥 2)握手交换AES密钥

<script type="text/javascript">
$(function() {
$("#form1").jCryption();
});
$.jCryption.defaultOptions.getKeysURL="encrypt?generateKeyPair=true";
$.jCryption.defaultOptions.handshakeURL="encrypt?handshake=true";
</script>

服务端

密钥服务Servlet

  1. public class CryptoServlet extends HttpServlet{
  2. /**
  3. * serialVersionUID
  4. */
  5. private static final long serialVersionUID = 4510110365995157499L;
  6.  
  7. /**
  8. * Handles a POST request
  9. *
  10. * @see HttpServlet
  11. */
  12. public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
  13. HttpServletRequest request = (HttpServletRequest) req;
  14. HttpServletResponse response = (HttpServletResponse) res;
  15.  
  16. /** Generates a KeyPair for RSA **/
  17. if (req.getParameter("generateKeyPair") != null && req.getParameter("generateKeyPair").equals("true")) {
  18.  
  19. JCryption jc = new JCryption();
  20. KeyPair keys = jc.getKeyPair();
  21. request.getSession().getServletContext().setAttribute("jCryptionKeys", keys);
  22. String e = jc.getPublicExponent();
  23. String n = jc.getKeyModulus();
  24. String md = String.valueOf(jc.getMaxDigits());
  25.  
  26. /** Sends response **/
  27. PrintWriter out = response.getWriter();
  28. out.print("{\"e\":\"" + e + "\",\"n\":\"" + n + "\",\"maxdigits\":\"" + md + "\"}");
  29. return;
  30. }
  31. /** jCryption handshake **/
  32. else if (req.getParameter("handshake") != null && req.getParameter("handshake").equals("true")) {
  33.  
  34. /** Decrypts password using private key **/
  35. JCryption jc = new JCryption((KeyPair) request.getSession().getServletContext()
  36. .getAttribute("jCryptionKeys"));
  37. String a = req.getParameter("key");
  38. System.out.println(a);
  39. String key = jc.decrypt(req.getParameter("key"));
  40.  
  41. request.getSession().getServletContext().removeAttribute("jCryptionKeys");
  42. request.getSession().getServletContext().setAttribute("jCryptionKey", key);
  43.  
  44. /** Encrypts password using AES **/
  45. String ct = AesCtr.encrypt(key, key, 256);
  46.  
  47. /** Sends response **/
  48. PrintWriter out = response.getWriter();
  49. out.print("{\"challenge\":\"" + ct + "\"}");
  50.  
  51. return;
  52. }
  53. /** jCryption request to decrypt a String **/
  54. else if (req.getParameter("decryptData") != null && req.getParameter("decryptData").equals("true")
  55. && req.getParameter("jCryption") != null) {
  56.  
  57. /** Decrypts the request using password **/
  58. String key = (String) request.getSession().getServletContext().getAttribute("jCryptionKey");
  59.  
  60. String pt = AesCtr.decrypt(req.getParameter("jCryption"), key, 256);
  61.  
  62. /** Sends response **/
  63. PrintWriter out = response.getWriter();
  64. out.print("{\"data\":\"" + pt + "\"}");
  65. return;
  66. }
  67. /** jCryption request to encrypt a String **/
  68. else if (req.getParameter("encryptData") != null && req.getParameter("encryptData").equals("true")
  69. && req.getParameter("jCryption") != null) {
  70.  
  71. /** Encrypts the request using password **/
  72. String key = (String) request.getSession().getServletContext().getAttribute("jCryptionKey");
  73.  
  74. String ct = AesCtr.encrypt(req.getParameter("jCryption"), key, 256);
  75.  
  76. /** Sends response **/
  77. PrintWriter out = response.getWriter();
  78. out.print("{\"data\":\"" + ct + "\"}");
  79. return;
  80. }
  81. /** A test request from jCryption **/
  82. else if (req.getParameter("decryptTest") != null && req.getParameter("decryptTest").equals("true")) {
  83.  
  84. /** Encrypts a timestamp **/
  85. String key = (String) request.getSession().getServletContext().getAttribute("jCryptionKey");
  86.  
  87. String date = DateFormat.getInstance().format(new Date());
  88.  
  89. String ct = AesCtr.encrypt(date, key, 256);
  90.  
  91. /** Sends response **/
  92. PrintWriter out = response.getWriter();
  93. out.print("{\"encrypted\":\"" + ct + "\", \"unencrypted\":\"" + date + "\"}");
  94. return;
  95. }
  96. }
  97.  
  98. /**
  99. * Handles a GET request
  100. *
  101. * @see HttpServlet
  102. */
  103. public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
  104. doPost(req, res);
  105. }
  106. }

过虑器,进行数据解密

密文:5QN8EsTjylTGSyvrmYGXDUD/MjF3qcl58pZtI7xhCk5HMUYFjf7kJe/leQLAuqzW4dPUNw==
明文:loginName=admin&password=admin&Submit=提交

  1. public class SecureFilter implements Filter{
  2. private FilterConfig conf;
  3.  
  4. public void destroy() {
  5. // TODO Auto-generated method stub
  6.  
  7. }
  8.  
  9. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
  10. ServletException {
  11. String jCryption = request.getParameter("jCryption");
  12. System.out.println(jCryption);
  13. String key = (String) conf.getServletContext().getAttribute("jCryptionKey");
  14.  
  15. String source = AesCtr.decrypt(jCryption, key, 256);
  16. System.out.println(source);
  17.  
  18. String[] params = source.split("&");
  19. for(int i=0;i<params.length;i++){
  20. String [] aparam = params[i].split("=");
  21. request.setAttribute(aparam[0], aparam[1]);
  22. }
  23.  
  24. chain.doFilter(request, response);
  25.  
  26. }
  27.  
  28. public void init(FilterConfig filterConfig) throws ServletException {
  29. this.conf = filterConfig;
  30.  
  31. }
  32.  
  33. }

处理器,从request.getAttribute中获取数据

  1. String loginName = passwordAuthcInfo.getLoginName();
  2. String loginPassword = passwordAuthcInfo.getPassword();
  3. if(loginName == null && loginPassword == null){
  4. loginName = (String)request.getAttribute("loginName");
  5. loginPassword = (String)request.getAttribute("password");
  6. }

客户端JavaScript加密数据,服务端Java解密数据的更多相关文章

  1. 基于NIO的同步非阻塞编程完整案例,客户端发送请求,服务端获取数据并返回给客户端数据,客户端获取返回数据

    这块还是挺复杂的,挺难理解,但是多练几遍,多看看研究研究其实也就那样,就是一个Selector轮询的过程,这里想要双向通信,客户端和服务端都需要一个Selector,并一直轮询, 直接贴代码: Ser ...

  2. java版gRPC实战之六:客户端动态获取服务端地址

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. IOS开发系列之阿堂教程:玩转IPhone客户端和Web服务端交互(客户端)实践

    说到ios的应用开发,我们不能不提到web server服务端,如果没有服务端的支持,ios应用开发就没有多大意义了,因为从事过手机开发的朋友都知道(Android也一样),大量复杂业务的处理和数据库 ...

  4. 使用DWR实现JS调用服务端Java代码

    DWR简介 DWR全称Direct Web Remoting,是一款非常优秀的远程过程调用(Remote Procedure Call)框架,通过浏览器提供的Ajax引擎实现在前端页面的JS代码中调用 ...

  5. Android客户端与PHP服务端交互(一)---框架概述

    背景 作为一个普通上班族,总是想做一些自认为有意义的事情,于是乎准备成立一个工作室,尽管目前正在筹备阶段,但是之前有些朋友提出一些需求的时候,我发现自己的能力还是有限,直到最近和一些技术牛朋友聊起这事 ...

  6. java工具类(一)之服务端java实现根据地址从百度API获取经纬度

    服务端java实现根据地址从百度API获取经纬度 代码: package com.pb.baiduapi; import java.io.BufferedReader; import java.io. ...

  7. 6-1 建立客户端与zk服务端的连接

    6-1 建立客户端与zk服务端的连接 zookeeper原生java api使用 会话连接与恢复; 节点的增删改查; watch与acl的相关操作; 导入jar包;

  8. android客户端app和服务端交互token的作用

    Android客户端和服务端如何使用Token和Session niceheart关注1人评论34644人阅读2014-09-16 16:38:44   对于初学者来说,对Token和Session的 ...

  9. XFire客户端调用CXF服务端(四)

    前面章节:http://www.cnblogs.com/xiehongwei/p/8082337.html 已经开发出了CXF服务端,现在用XFire开发客户端调用CXF服务端,代码如下: impor ...

随机推荐

  1. RPC-Thrift(三)

    TProtocol TProtocol定义了消息怎么进行序列化和反序列化的. TProtocol的类结构图如下: TBinaryProtocol:二进制编码格式: TCompactProtocol:高 ...

  2. Hadoop简单源码样例

    1.WordCount策略比较简单 import java.io.IOException; import java.util.StringTokenizer; import org.apache.ha ...

  3. HDU1174(空间点到直线的距离,用叉积)

    爆头 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...

  4. 无法解析的DNS服务地址

    如果DNS服务器地址设置不当,可能会导致网速慢.出现弹窗广告.网址打不开.打开不是自己想要的网站等一系列问题. 请参考: DNS的作用是什么,怎样设置DNS? https://jingyan.baid ...

  5. 关于一些Java基础数据类型的常用方法的应用场景的小思考

    昨天遇到一个问题,按照我的一半解决方法是传一个参数,然后通过参数来控制逻辑处理:但是领导发现String的一个方法也可以完全完成该问题!而我完全没有get到这个点! so,我认识到了自己的知识盲区:基 ...

  6. SQL--相关子查询 与 非相关子查询

    SQL 子查询可以分为相关子查询 与 非相关子查询. 假设Books表如下: 类编号 图书名 出版社 价格 ---------------------------------------------- ...

  7. pandas求五日线并画图

    import pandas as pd import numpy as np import matplotlib.pyplot as plt stock_data = pd.read_csv('000 ...

  8. Selenium2+python自动化73-定位的坑:class属性有空格【转载】

    前言 有些class属性中间有空格,如果直接复制过来定位是会报错的InvalidSelectorException: Message: The given selector u-label f-dn ...

  9. Vmware esxi开启snmp服务

    https://jingyan.baidu.com/article/9f7e7ec055c4c86f28155435.html http://pubs.vmware.com/vsphere-50/in ...

  10. ubantu16.04服务器错误提示没有安装php_fileinfo扩展

    如果你是安装的LNMP1.3full一键安装包,安装的是php5.6.22,你会遇到这个错误,解决方法也不难,请看如下: 不需要去下载扩展,只需要进入此fileinfo目录(我这里有多个版本5.6,7 ...