第一步:

获得RSA公钥私钥(秘钥格式:PKCS#8 ,测试使用的是无私钥密码的)

公钥:

-----BEGIN PUBLIC KEY-----

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDAy8GL3N2/M1IgrG3ixFUJ8crC

wuEXZqGUnvjH0wDraN3U4fFixvg0PD+LvXhpBOBhsxC8Txg66HgWUnWwAU/+Fy4g

litH3oAoNI9ouM71fFCuO01q/YKEKFOpYvRlrXmc013HU0TSZLmSFt30j7mHSjsj

QwlfWTO7rZmU/KRGPwIDAQAB

-----END PUBLIC KEY-----

私钥:

-----BEGIN PRIVATE KEY-----

MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMDLwYvc3b8zUiCs

beLEVQnxysLC4RdmoZSe+MfTAOto3dTh8WLG+DQ8P4u9eGkE4GGzELxPGDroeBZS

dbABT/4XLiCWK0fegCg0j2i4zvV8UK47TWr9goQoU6li9GWteZzTXcdTRNJkuZIW

3fSPuYdKOyNDCV9ZM7utmZT8pEY/AgMBAAECgYBMyVpe0CrpWhFdvg9OABA2k7zD

8UYhQdkdDmvbemilWfDwNsUjKEf21gAhMedhPHX5s4340i++VpRtn44L+ZnX0g4m

j3bh4hiY7G+X+Ia0sCA//oBnLOHTvnrkKm4sbDd5R1YAgMXCMDxunYeodnytKeyh

nNYBpuHkBXVPOEThMQJBAO570+r7K25wDmH3jxr0USfFaYt2ogoazr4D0GNP3Bjz

i6f15IHz4vcW0InY6t06FqJU00zX7Y2XgZIq0sEDOsUCQQDO9N4y5HYH9aE3oHUM

KghwWXGyXZCzcwA+rl4ieeysUXGrThLjJNmiunt3L2MzYQ8uZ3biP4ECFiqyJNxs

bl0zAkEAsEbDO7twPO+DEhLkqm3Q1u7qtvV3jLSIAJfdHqtW6vKKVhpBT3UwXKd2

eY3m/KMFO/QrQ2+P3csRMTOKGLUEaQJAaWCxi0Rc/SyLDGH9d1Ynud0xUVrnBRh3

dXMfp3phklReBpXYdCQdVQiTOVq9rjmrmzs/g3BGZiOXVeIDAosnlQJAZiFjZVwu

4sFJu+1IQA/IoHFBadJlVTQk5qMEBEMlNWprGdEPS2LAzQywp0UoIKukd6m0N858

Ln0hh1pBvGPMMQ==

-----END PRIVATE KEY-----

(RSA公钥私钥获得来源: http://web.chacuo.net/netrsakeypair

如图:

第二步:向Maven项目中导入工具类:

RsaDecryptRequestParamFilter.java  用于过滤请求 过滤掉不需要加密数据的请求地址,需要在web.xml文件配置

主要解读doFilter方法,根据需求结合下面的第三步的web.xml文件配置,以便于更快速的理解

package com.lc.utils;

import java.io.IOException;
import java.lang.reflect.Field;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest; import org.springframework.http.HttpMethod; public class RsaDecryptRequestParamFilter implements Filter { private static Field requestField; private static Field parametersParsedField; private static Field coyoteRequestField; private static Field parametersField; private static Field hashTabArrField; private List<String> NeedRsaUrl; public void init(FilterConfig filterConfig) throws ServletException {
try {
Class clazz = Class.forName("org.apache.catalina.connector.RequestFacade");
requestField = clazz.getDeclaredField("request");
requestField.setAccessible(true); parametersParsedField = requestField.getType().getDeclaredField("parametersParsed");
parametersParsedField.setAccessible(true); coyoteRequestField = requestField.getType().getDeclaredField("coyoteRequest");
coyoteRequestField.setAccessible(true); parametersField = coyoteRequestField.getType().getDeclaredField("parameters");
parametersField.setAccessible(true); hashTabArrField = parametersField.getType().getDeclaredField("paramHashValues");
hashTabArrField.setAccessible(true); NeedRsaUrl = Arrays.asList(replaceBlank(filterConfig.getInitParameter("NeedRsaUrl")).split(",")); System.out.println("RsaFilter初始化完成,不需要解密的Post方法为:{}"+ NeedRsaUrl); } catch (Exception e) {
e.printStackTrace();
}
} public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
servletResponse.setCharacterEncoding("UTF-8"); //String url = ((HttpServletRequest) servletRequest).getServletPath();
//获得post请求路径
String url = req.getServletPath();
//判断是否包含需要加密的post请求
if (NeedRsaUrl.contains(url)) {
System.out.println("需要加密的请求NeedRsaUrl分别有:"+NeedRsaUrl);
System.out.println("此时加密请求路径是"+url);
//包含需要加密的post请求(/user/tologin.action)
Object rsaKey = req.getParameter("data");//密文:rsaKey
if (req.getMethod().equals(HttpMethod.POST.name())) {
//判断是否有密文
if (null != rsaKey) {
String[] params;
try {
String paramValue = RsaUtil.decryptRequestParamValue((String) rsaKey);//调用工具类RSAUtil 传参(密文) 解密
params = paramValue.split("&");
} catch (Exception e) {
e.printStackTrace();
servletResponse.getWriter().write("{\"code\":\"403\",\"message\":\"密文错误\"}");
return;
}
Map<String, ArrayList<String>> requestParamtersMap = getRequestMap(servletRequest);
for (int i = 0; i < params.length; i++) {
String[] param = params[i].split("=");
if (param.length == 2){
@SuppressWarnings("rawtypes")
ArrayList list = new ArrayList<Object>();
list.add(URLDecoder.decode(param[1], "UTF-8"));
requestParamtersMap.put(param[0], list);
}
} } else {
servletResponse.getWriter().write("{\"code\":\"403\",\"message\":\"缺少密文\"}");
return;
}
}
}
//不需要加密的post请求匹配成功,放过不需要加密的post请求
filterChain.doFilter(servletRequest, servletResponse);
} public void destroy() { } private Map<String, ArrayList<String>> getRequestMap(ServletRequest request) {
try {
Object innerRequest = requestField.get(request);
parametersParsedField.setBoolean(innerRequest, true);
Object coyoteRequestObject = coyoteRequestField.get(innerRequest);
Object parameterObject = parametersField.get(coyoteRequestObject);
return (Map<String, ArrayList<String>>) hashTabArrField.get(parameterObject);
} catch (IllegalAccessException e) {
e.printStackTrace();
return Collections.emptyMap();
}
} public String replaceBlank(String str) {
String dest = "";
if (str!=null) {
Pattern p = Pattern.compile("\\s*|\t|\r|\n");
Matcher m = p.matcher(str);
dest = m.replaceAll("");
}
return dest;
} }

第三步:配置web.xml文件

此路径/user/dologin.action的参数需要加密 所以需要在<param-name>标签内配置,

也是说可以根据自我需求在<param-name>标签内配置需要加密的请求路径

可以参照对比RsaDecryptRequestParamFilter.java类的doFilter方法

          <!--加载RsaDecryptRequestParamFilter-->
<filter>
<filter-name>RSA</filter-name>
<filter-class>com.lc.utils.RsaDecryptRequestParamFilter</filter-class>
<init-param>
<description>过滤掉不需要加密的post请求 留下需要加密的请求 如路径:/user/dologin.action,/fuwu/doyuyue.action</description>
<param-name>NeedRsaUrl</param-name>
<param-value>/user/dologin.action,/fuwu/doyuyue.action</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>RSA</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

第五步:下载js地址:http://files.cnblogs.com/files/ytwy/jsencrypt.min.zip  解压放入项目webapp下

下载如图:

最后一步:

例如做的是有关用户登录的数据加密:

关于登录用的form表单的代码  根据需要 自我定义

以下是登录form表单中数据的加密操作及ajax提交的代码:

<!--引入下载的jsencrypt.min.js  为数据创造加密环境-->
<script type="text/javascript" src="<%=request.getContextPath() %>/jsencrypt/jsencrypt.min.js"></script>
<script type="text/javascript">
$(function() {
$("#login").click(function() {/*form表单数据的登录按钮触发事件 */
var encrypt=new JSEncrypt();
/*放入获得的公钥*/
encrypt.setPublicKey("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC1ktivIcFm6pmMafrOHWLW5dHpqk2qFeZJQ/XYYzrKF7rj6jv5qRr0P2ihB1iw+tlz8FKaxHPOvWTmRJzfjFsNhHyfPwHoyDPThc2LHtv7UzHVHSfUTWEH5e1xbYYkHNQEy76Y0q/oAaHf8ms1xe/Z4oq5MqIY2mENYMEpBcACuwIDAQAB");
/*放入,获得有关用户登录的表单数据*/
encrypted=encrypt.encrypt($("form").serialize());
          alert(encryted);
$.post(
"<%=request.getContextPath() %>/user/dologin.action",
{"data":encrypted},
function(data) {
if(data){
alert("登录成功!!!");location.href="<%=request.getContextPath() %>/user/console.action";
}else{
alert("此用户不存在,请注册后,再登录!!!");location.reload();
}
},
"json"
);
});
});
</script>

 有关Maven项目的RSA加密解密(用户数据)的配置流程结束。。。。。。

以下是对其效果的小小测试的:

弹出的密文就是上面代码定义的效果的体现

然后登录的post请求路径被RsaDecryptRequestParamFilter.java类 过滤时  ,doFilter方法中因容错机制满足(包含)要加密的请求,就会调用的RSAUtil.java类的静态方法进行解密(密文)

即解密效果:

。。。。。。。。。

不煮米饭的电饭锅

Java采用RSA加密及解密技术的有关Maven项目的配置流程:的更多相关文章

  1. IOS, Android, Java Web Rest : RSA 加密和解密问题

    IOS, Android, Java Web Rest :  RSA 加密和解密问题 一对公钥私钥可以使用 OpenSSL创建, 通常 1024位长度够了. 注意: 1. 公钥私钥是BASE64编码的 ...

  2. C# javascript 采用 RSA 加密解密

    C# javascript 采用 RSA 加密解密 1.C#提供公钥 2.javascript用公钥加密 3.C#用私钥解密 4.javascript 类库 https://www.pidder.de ...

  3. C#实现RSA加密与解密、签名与认证(转)

    一.RSA简介 RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的.RSA取名来自开发他们三者的名字.RSA是目前最有影响力 ...

  4. C#实现RSA加密与解密、签名与认证

    一.RSA简介 RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的.RSA取名来自开发他们三者的名字.RSA是目前最有影响力 ...

  5. RSA加密和解密工具类

    import org.apache.commons.codec.binary.Base64; import javax.crypto.Cipher; import java.security.*; i ...

  6. JAVA实现RSA加密,非对称加密算法

    RSA.java package org.icesnow.jeasywx.util.security; import java.security.Key; import java.security.K ...

  7. 通过ios实现RSA加密和解密

    在加密和解密中,我们需要了解的知识有什么事openssl:RSA加密算法的基本原理:如何通过openssl生成最后我们需要的der和p12文件. 废话不多说,直接写步骤: 第一步:openssl来生成 ...

  8. C#实现RSA加密和解密详解

    原文:C#实现RSA加密和解密详解 RSA加密解密源码: Code highlighting produced by Actipro CodeHighlighter (freeware) http:/ ...

  9. ASP.NET Core RSA加密或解密

    前言 这两天主要是公司同事用到了RSA加密,事后也看了下,以为很简单,最终利用RSACryptoServiceProvider来实现RSA加密,然后大致了解到RSACryptoServiceProvi ...

随机推荐

  1. 18.12 SDRAM和NAND FLASH区别

    处理器运行时要做大量的数据计算和交换,要求内存读写速度很快. NOR Flash读取快,写入慢,总线结构,能运行代码,价格贵. NAND Flash读取慢,写入快,非总线结构,不能运行代码,价格便宜. ...

  2. 批量ping测试的脚本

    #脚本开始 #!/bin/bash HOSTLIST=`cat /usr/local/ipaddrs.txt` for IP in $HOSTLIST do ping -c 3 -i 0.2 -W 3 ...

  3. Java中所涉及到的设计模式小记

    一.JAVA设计模式一共有23中.其中这23中大体可以分为3类,具体分法如下所示: 1.创建型模式:涉及到的设计模式共5种,分别是: 工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 2.结 ...

  4. ignoreDependencyType(Class class)方法使用

    该方法字面意思是忽略依赖类,注释给出的解释是在自动装配时忽略指定类型的依赖注入. 经过我在网上查的资料,发现自动装配有两种方式: 一种是在xml配置文件中的<beans>标签中配置一个属性 ...

  5. 京东饭粒捡漏V1.1.0

    20180624 更新 V1.1.01.解决进程残留问题:2.加入急速下单模式: 功能介绍1.京东商城专用,支持饭粒模式下单,自己获得京豆返利 2.捡漏模式:帮助用户监控抢购商品,有库存的时候进行抢单 ...

  6. 《剑指offer(第二版)》面试题60——n个骰子的点数

    一.题目描述 把n个骰子仍在地上,所有的骰子朝上的一面的点数之和为s,输入n,打印出s所有可能的值出现的概率. 二.题解 <剑指offer>上给出的两种方法,尤其是代码,晦涩难懂且没有注释 ...

  7. 使用 JavaScript 拦截和跟踪浏览器中的 HTTP 请求

    HTTP 请求的拦截技术可以广泛地应用在反向代理.拦截 Ajax 通信.网页的在线翻译.网站改版重构等方面.而拦截根据位置可以分为服务器端和客户端两大类,客户端拦截借助 JavaScript 脚本技术 ...

  8. Android屏幕亮度调节相关源码

    如下代码内容是关于Android屏幕亮度调节相关的代码. public static boolean isAutoBrightness(ContentResolver aContentResolver ...

  9. JS代码简单一段即可破解QQ空间删除说说

    代码如下: 简单的一段代码即可搞定啦!!是不是很简单! var delay = 1000; function del() { document.querySelector('.app_canvas_f ...

  10. eclipse--常见问题

    学习java的都知道这个编辑器,但这个编辑器的有很多功能很多人不知道怎么用,我系统的整理一下我学习过程中遇到的过的问题 1.eclipse如何导入external jar包?        参考:ht ...