客户端JavaScript加密数据,服务端Java解密数据
原文: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
- public class CryptoServlet extends HttpServlet{
- /**
- * serialVersionUID
- */
- private static final long serialVersionUID = 4510110365995157499L;
- /**
- * Handles a POST request
- *
- * @see HttpServlet
- */
- public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
- HttpServletRequest request = (HttpServletRequest) req;
- HttpServletResponse response = (HttpServletResponse) res;
- /** Generates a KeyPair for RSA **/
- if (req.getParameter("generateKeyPair") != null && req.getParameter("generateKeyPair").equals("true")) {
- JCryption jc = new JCryption();
- KeyPair keys = jc.getKeyPair();
- request.getSession().getServletContext().setAttribute("jCryptionKeys", keys);
- String e = jc.getPublicExponent();
- String n = jc.getKeyModulus();
- String md = String.valueOf(jc.getMaxDigits());
- /** Sends response **/
- PrintWriter out = response.getWriter();
- out.print("{\"e\":\"" + e + "\",\"n\":\"" + n + "\",\"maxdigits\":\"" + md + "\"}");
- return;
- }
- /** jCryption handshake **/
- else if (req.getParameter("handshake") != null && req.getParameter("handshake").equals("true")) {
- /** Decrypts password using private key **/
- JCryption jc = new JCryption((KeyPair) request.getSession().getServletContext()
- .getAttribute("jCryptionKeys"));
- String a = req.getParameter("key");
- System.out.println(a);
- String key = jc.decrypt(req.getParameter("key"));
- request.getSession().getServletContext().removeAttribute("jCryptionKeys");
- request.getSession().getServletContext().setAttribute("jCryptionKey", key);
- /** Encrypts password using AES **/
- String ct = AesCtr.encrypt(key, key, 256);
- /** Sends response **/
- PrintWriter out = response.getWriter();
- out.print("{\"challenge\":\"" + ct + "\"}");
- return;
- }
- /** jCryption request to decrypt a String **/
- else if (req.getParameter("decryptData") != null && req.getParameter("decryptData").equals("true")
- && req.getParameter("jCryption") != null) {
- /** Decrypts the request using password **/
- String key = (String) request.getSession().getServletContext().getAttribute("jCryptionKey");
- String pt = AesCtr.decrypt(req.getParameter("jCryption"), key, 256);
- /** Sends response **/
- PrintWriter out = response.getWriter();
- out.print("{\"data\":\"" + pt + "\"}");
- return;
- }
- /** jCryption request to encrypt a String **/
- else if (req.getParameter("encryptData") != null && req.getParameter("encryptData").equals("true")
- && req.getParameter("jCryption") != null) {
- /** Encrypts the request using password **/
- String key = (String) request.getSession().getServletContext().getAttribute("jCryptionKey");
- String ct = AesCtr.encrypt(req.getParameter("jCryption"), key, 256);
- /** Sends response **/
- PrintWriter out = response.getWriter();
- out.print("{\"data\":\"" + ct + "\"}");
- return;
- }
- /** A test request from jCryption **/
- else if (req.getParameter("decryptTest") != null && req.getParameter("decryptTest").equals("true")) {
- /** Encrypts a timestamp **/
- String key = (String) request.getSession().getServletContext().getAttribute("jCryptionKey");
- String date = DateFormat.getInstance().format(new Date());
- String ct = AesCtr.encrypt(date, key, 256);
- /** Sends response **/
- PrintWriter out = response.getWriter();
- out.print("{\"encrypted\":\"" + ct + "\", \"unencrypted\":\"" + date + "\"}");
- return;
- }
- }
- /**
- * Handles a GET request
- *
- * @see HttpServlet
- */
- public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
- doPost(req, res);
- }
- }
过虑器,进行数据解密
密文:5QN8EsTjylTGSyvrmYGXDUD/MjF3qcl58pZtI7xhCk5HMUYFjf7kJe/leQLAuqzW4dPUNw==
明文:loginName=admin&password=admin&Submit=提交
- public class SecureFilter implements Filter{
- private FilterConfig conf;
- public void destroy() {
- // TODO Auto-generated method stub
- }
- public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
- ServletException {
- String jCryption = request.getParameter("jCryption");
- System.out.println(jCryption);
- String key = (String) conf.getServletContext().getAttribute("jCryptionKey");
- String source = AesCtr.decrypt(jCryption, key, 256);
- System.out.println(source);
- String[] params = source.split("&");
- for(int i=0;i<params.length;i++){
- String [] aparam = params[i].split("=");
- request.setAttribute(aparam[0], aparam[1]);
- }
- chain.doFilter(request, response);
- }
- public void init(FilterConfig filterConfig) throws ServletException {
- this.conf = filterConfig;
- }
- }
处理器,从request.getAttribute中获取数据
- String loginName = passwordAuthcInfo.getLoginName();
- String loginPassword = passwordAuthcInfo.getPassword();
- if(loginName == null && loginPassword == null){
- loginName = (String)request.getAttribute("loginName");
- loginPassword = (String)request.getAttribute("password");
- }
客户端JavaScript加密数据,服务端Java解密数据的更多相关文章
- 基于NIO的同步非阻塞编程完整案例,客户端发送请求,服务端获取数据并返回给客户端数据,客户端获取返回数据
这块还是挺复杂的,挺难理解,但是多练几遍,多看看研究研究其实也就那样,就是一个Selector轮询的过程,这里想要双向通信,客户端和服务端都需要一个Selector,并一直轮询, 直接贴代码: Ser ...
- java版gRPC实战之六:客户端动态获取服务端地址
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- IOS开发系列之阿堂教程:玩转IPhone客户端和Web服务端交互(客户端)实践
说到ios的应用开发,我们不能不提到web server服务端,如果没有服务端的支持,ios应用开发就没有多大意义了,因为从事过手机开发的朋友都知道(Android也一样),大量复杂业务的处理和数据库 ...
- 使用DWR实现JS调用服务端Java代码
DWR简介 DWR全称Direct Web Remoting,是一款非常优秀的远程过程调用(Remote Procedure Call)框架,通过浏览器提供的Ajax引擎实现在前端页面的JS代码中调用 ...
- Android客户端与PHP服务端交互(一)---框架概述
背景 作为一个普通上班族,总是想做一些自认为有意义的事情,于是乎准备成立一个工作室,尽管目前正在筹备阶段,但是之前有些朋友提出一些需求的时候,我发现自己的能力还是有限,直到最近和一些技术牛朋友聊起这事 ...
- java工具类(一)之服务端java实现根据地址从百度API获取经纬度
服务端java实现根据地址从百度API获取经纬度 代码: package com.pb.baiduapi; import java.io.BufferedReader; import java.io. ...
- 6-1 建立客户端与zk服务端的连接
6-1 建立客户端与zk服务端的连接 zookeeper原生java api使用 会话连接与恢复; 节点的增删改查; watch与acl的相关操作; 导入jar包;
- android客户端app和服务端交互token的作用
Android客户端和服务端如何使用Token和Session niceheart关注1人评论34644人阅读2014-09-16 16:38:44 对于初学者来说,对Token和Session的 ...
- XFire客户端调用CXF服务端(四)
前面章节:http://www.cnblogs.com/xiehongwei/p/8082337.html 已经开发出了CXF服务端,现在用XFire开发客户端调用CXF服务端,代码如下: impor ...
随机推荐
- RPC-Thrift(三)
TProtocol TProtocol定义了消息怎么进行序列化和反序列化的. TProtocol的类结构图如下: TBinaryProtocol:二进制编码格式: TCompactProtocol:高 ...
- Hadoop简单源码样例
1.WordCount策略比较简单 import java.io.IOException; import java.util.StringTokenizer; import org.apache.ha ...
- HDU1174(空间点到直线的距离,用叉积)
爆头 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...
- 无法解析的DNS服务地址
如果DNS服务器地址设置不当,可能会导致网速慢.出现弹窗广告.网址打不开.打开不是自己想要的网站等一系列问题. 请参考: DNS的作用是什么,怎样设置DNS? https://jingyan.baid ...
- 关于一些Java基础数据类型的常用方法的应用场景的小思考
昨天遇到一个问题,按照我的一半解决方法是传一个参数,然后通过参数来控制逻辑处理:但是领导发现String的一个方法也可以完全完成该问题!而我完全没有get到这个点! so,我认识到了自己的知识盲区:基 ...
- SQL--相关子查询 与 非相关子查询
SQL 子查询可以分为相关子查询 与 非相关子查询. 假设Books表如下: 类编号 图书名 出版社 价格 ---------------------------------------------- ...
- pandas求五日线并画图
import pandas as pd import numpy as np import matplotlib.pyplot as plt stock_data = pd.read_csv('000 ...
- Selenium2+python自动化73-定位的坑:class属性有空格【转载】
前言 有些class属性中间有空格,如果直接复制过来定位是会报错的InvalidSelectorException: Message: The given selector u-label f-dn ...
- Vmware esxi开启snmp服务
https://jingyan.baidu.com/article/9f7e7ec055c4c86f28155435.html http://pubs.vmware.com/vsphere-50/in ...
- ubantu16.04服务器错误提示没有安装php_fileinfo扩展
如果你是安装的LNMP1.3full一键安装包,安装的是php5.6.22,你会遇到这个错误,解决方法也不难,请看如下: 不需要去下载扩展,只需要进入此fileinfo目录(我这里有多个版本5.6,7 ...