update:第三方待办添加用户名后缀并加密,第三方点击可跳转至审批处理页面

This commit is contained in:
luoluogit 2024-12-17 14:21:22 +08:00
parent 15753ba9ab
commit 92fceb9317
5 changed files with 248 additions and 66 deletions

View File

@ -1,25 +1,24 @@
package shkd.sys.sys.eoss; package shkd.sys.sys.eoss;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import kd.bos.cache.CacheFactory; import kd.bos.cache.CacheFactory;
import kd.bos.cache.DistributeSessionlessCache; import kd.bos.cache.DistributeSessionlessCache;
import kd.bos.exception.ErrorCode;
import kd.bos.exception.KDBizException;
import kd.bos.exception.KDException;
import kd.bos.logging.Log; import kd.bos.logging.Log;
import kd.bos.logging.LogFactory; import kd.bos.logging.LogFactory;
import kd.bos.login.thirdauth.ThirdSSOAuthHandler; import kd.bos.login.thirdauth.ThirdSSOAuthHandler;
import kd.bos.login.thirdauth.UserAuthResult; import kd.bos.login.thirdauth.UserAuthResult;
import kd.bos.login.thirdauth.UserProperType; import kd.bos.login.thirdauth.UserProperType;
import kd.bos.servicehelper.user.UserServiceHelper; import kd.bos.servicehelper.user.UserServiceHelper;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import redis.clients.jedis.Jedis; import shkd.sys.sys.utils.RSAUtils;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.security.PrivateKey;
import static kd.bos.login.thirdauth.UserProperType.UserName;
/** /**
* @author: Lang * @author: Lang
@ -30,20 +29,19 @@ public class SSOPluginLogin implements ThirdSSOAuthHandler {
private final String CLIENT_ID = System.getProperty("clientKey-scict"); private final String CLIENT_ID = System.getProperty("clientKey-scict");
private final String CLIENT_SECRET = System.getProperty("clientSecret-scict"); private final String CLIENT_SECRET = System.getProperty("clientSecret-scict");
private final String EOSS_IP = System.getProperty("ip-port"); private final String EOSS_IP = System.getProperty("ip-port");
/** /**
* 方法实现用户没有登录的时候跳转认证中心的登录地址 * 方法实现用户没有登录的时候跳转认证中心的登录地址
* @param httpServletRequest *
* @param httpServletResponse
* @param s
*/ */
@Override @Override
public void callTrdSSOLogin(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, String s) { public void callTrdSSOLogin(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, String s) {
//认证中心的登录地址
logger.info(String.format("eoss_ip:%s,client_id:%s,client_secret:%s,重定向地址:%s",EOSS_IP,CLIENT_ID,CLIENT_SECRET,s));
//认证中心的登录地址
logger.info(String.format("eoss_ip:%s,client_id:%s,client_secret:%s,重定向地址:%s", EOSS_IP, CLIENT_ID, CLIENT_SECRET, s));
try { try {
String ssourl= EOSS_IP+"/service/SGE-project-sctz-master/pc/dist/login.html"; String ssourl = EOSS_IP + "/service/SGE-project-sctz-master/pc/dist/login.html";
if (httpServletRequest.getRequestURI().contains("/auth/logout.do")){ if (httpServletRequest.getRequestURI().contains("/auth/logout.do")) {
String userName = UserServiceHelper.getCurrentUser("name").getString("name"); String userName = UserServiceHelper.getCurrentUser("name").getString("name");
DistributeSessionlessCache cache = CacheFactory.getCommonCacheFactory().getDistributeSessionlessCache("customRegion"); DistributeSessionlessCache cache = CacheFactory.getCommonCacheFactory().getDistributeSessionlessCache("customRegion");
String userKey = "user_sessionId_" + userName; // 构造一个唯一的键 String userKey = "user_sessionId_" + userName; // 构造一个唯一的键
@ -51,13 +49,13 @@ public class SSOPluginLogin implements ThirdSSOAuthHandler {
if (sessionId != null) { if (sessionId != null) {
AuthService.logout(EOSS_IP, sessionId); AuthService.logout(EOSS_IP, sessionId);
} }
}else{ } else {
/** /*
*重定向的统一认证的地址 获取授权码 *重定向的统一认证的地址 获取授权码
*/ */
ssourl=String.format("%s/sso2/authCenter/authorize?client_id=%s&response_type=code&authType=0&redirect_uri=%s", ssourl = String.format("%s/sso2/authCenter/authorize?client_id=%s&response_type=code&authType=0&redirect_uri=%s",
EOSS_IP,CLIENT_ID,s); EOSS_IP, CLIENT_ID, s);
logger.info(String.format("重定向地址→sendRedirect%s",ssourl)); logger.info(String.format("重定向地址→sendRedirect%s", ssourl));
} }
httpServletResponse.sendRedirect(ssourl); httpServletResponse.sendRedirect(ssourl);
} catch (IOException e) { } catch (IOException e) {
@ -67,24 +65,27 @@ public class SSOPluginLogin implements ThirdSSOAuthHandler {
/** /**
* 实现苍穹调用认证系统的接口解析认证凭据返回用户信息按数据格式返回认证结果 * 实现苍穹调用认证系统的接口解析认证凭据返回用户信息按数据格式返回认证结果
* @param httpServletRequest *
* @param httpServletResponse
* @return
*/ */
@Override @Override
public UserAuthResult getTrdSSOAuth(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { public UserAuthResult getTrdSSOAuth(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
logger.info(String.format("getTrdSSOAuth→httpServletRequest%s",httpServletRequest)); logger.info(String.format("getTrdSSOAuth→httpServletRequest%s", httpServletRequest));
//返回的认证结果 //返回的认证结果
UserAuthResult result=new UserAuthResult(); UserAuthResult result = new UserAuthResult();
//获取返回的授权码 //获取返回的授权码
String code = httpServletRequest.getParameter("code"); String code = httpServletRequest.getParameter("code");
//获取返回的 sessionId //获取返回的 sessionId
String sessionId = httpServletRequest.getParameter("sessionId"); String sessionId = httpServletRequest.getParameter("sessionId");
logger.info(String.format("getTrdSSOAuth→授权码code%s",code)); String userName = httpServletRequest.getParameter("userName");
if (StringUtils.isEmpty(code)){
// RSAUtils.
logger.info(String.format("getTrdSSOAuth→授权码code%s", code));
result.setUserType(UserProperType.UserName);
if (StringUtils.isEmpty(code) && StringUtils.isEmpty(userName)) {
logger.error("getTrdSSOAuth→授权码code为空"); logger.error("getTrdSSOAuth→授权码code为空");
result.setSucess(false); result.setSucess(false);
}else { return result;
} else if (StringUtils.isNotEmpty(code)){
try { try {
//TODO:调用accessToken方法 //TODO:调用accessToken方法
String access_token = AuthService.accessToken(code, EOSS_IP, CLIENT_ID, CLIENT_SECRET); String access_token = AuthService.accessToken(code, EOSS_IP, CLIENT_ID, CLIENT_SECRET);
@ -100,14 +101,23 @@ public class SSOPluginLogin implements ThirdSSOAuthHandler {
result.setUser(user); result.setUser(user);
result.setSucess(true); result.setSucess(true);
logger.info("SSO用户登录成功进入苍穹系统"); logger.info("SSO用户登录成功进入苍穹系统");
String userKey = "user_sessionId_" + user; // 构造一个唯一的键 String userKey = "user_sessionId_" + user; // 构造一个唯一的键
DistributeSessionlessCache cache = CacheFactory.getCommonCacheFactory().getDistributeSessionlessCache("customRegion"); DistributeSessionlessCache cache = CacheFactory.getCommonCacheFactory().getDistributeSessionlessCache("customRegion");
cache.put(userKey,sessionId);//将自定义参数加入缓存 cache.put(userKey, sessionId);//将自定义参数加入缓存
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); throw new KDBizException("获取用户信息接口异常SSO用户登录失败"+e);
}
}else if (StringUtils.isNotEmpty(userName)){
try{
PrivateKey privateKey1 = RSAUtils.getPrivateKey(Base64.decodeBase64(RSAUtils.privateKey));
String sourceData = new String(RSAUtils.decryptByKey(privateKey1, Base64.decodeBase64(userName.getBytes())));
result.setUser(sourceData);
result.setSucess(true);
logger.info("SSO用户登录成功进入苍穹系统");
}catch (Exception e){
ErrorCode errorCode = new ErrorCode("error_code", "私钥解密出现异常,请联系运维人员排查!");
throw new KDException(errorCode, e);
} }
} }
return result; return result;

View File

@ -7,6 +7,7 @@ import kd.bos.context.RequestContext;
import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.db.DB; import kd.bos.db.DB;
import kd.bos.db.DBRoute; import kd.bos.db.DBRoute;
import kd.bos.exception.ErrorCode;
import kd.bos.exception.KDException; import kd.bos.exception.KDException;
import kd.bos.logging.Log; import kd.bos.logging.Log;
import kd.bos.logging.LogFactory; import kd.bos.logging.LogFactory;
@ -15,11 +16,12 @@ import kd.bos.orm.query.QFilter;
import kd.bos.schedule.executor.AbstractTask; import kd.bos.schedule.executor.AbstractTask;
import kd.bos.servicehelper.QueryServiceHelper; import kd.bos.servicehelper.QueryServiceHelper;
import kd.bos.util.StringUtils; import kd.bos.util.StringUtils;
import org.apache.commons.codec.binary.Base64;
import shkd.sys.sys.midservice.handler.CreateToDoHandler; import shkd.sys.sys.midservice.handler.CreateToDoHandler;
import shkd.sys.sys.midservice.handler.DealToDoHandler; import shkd.sys.sys.midservice.handler.DealToDoHandler;
import shkd.sys.sys.midservice.handler.deleteToDoHandler; import shkd.sys.sys.midservice.handler.deleteToDoHandler;
import shkd.sys.sys.midservice.model.BacklogMessage;
import shkd.sys.sys.midservice.utils.GetUrlUtils; import shkd.sys.sys.midservice.utils.GetUrlUtils;
import shkd.sys.sys.utils.RSAUtils;
import java.util.*; import java.util.*;
@ -55,7 +57,7 @@ public class ToDoResendTack extends AbstractTask {
logger.info("组装待办、已办重发的数据"); logger.info("组装待办、已办重发的数据");
Date beginTimeDate = startTimeDate; Date beginTimeDate = startTimeDate;
// 待办 // 待办
boolean hasNext = true; // boolean hasNext = true;
logger.info("开始抽取待办,参数 beginTimeDate" + beginTimeDate + "endTimeDate:" + endTimeDate); logger.info("开始抽取待办,参数 beginTimeDate" + beginTimeDate + "endTimeDate:" + endTimeDate);
extractToDoList(beginTimeDate, endTimeDate, "0"); extractToDoList(beginTimeDate, endTimeDate, "0");
extractToDoList(beginTimeDate, endTimeDate, "2"); extractToDoList(beginTimeDate, endTimeDate, "2");
@ -67,13 +69,12 @@ public class ToDoResendTack extends AbstractTask {
* @param startTime 开始时间 * @param startTime 开始时间
* @param endTime 结束时间 * @param endTime 结束时间
* @param t_status 待办状态 * @param t_status 待办状态
* @return
*/ */
private void extractToDoList(Date startTime, Date endTime, String t_status) { private void extractToDoList(Date startTime, Date endTime, String t_status) {
String accountId = System.getProperty("backlog-accountid"); String accountId = System.getProperty("backlog-accountid");
logger.info("拼接sql,此次拼接的待办类型为:" + t_status + "(1:待办、2已办、5撤销),使用参数startTime" + startTime + "endTime:" logger.info("拼接sql,此次拼接的待办类型为:" + t_status + "(1:待办、2已办、5撤销),使用参数startTime" + startTime + "endTime:"
+ endTime); + endTime);
StringBuffer cwbSql1 = new StringBuffer(); StringBuilder cwbSql1 = new StringBuilder();
cwbSql1.append("SELECT "); cwbSql1.append("SELECT ");
cwbSql1.append("b.FID,"); cwbSql1.append("b.FID,");
cwbSql1.append("b.FPROCDEFID,"); cwbSql1.append("b.FPROCDEFID,");
@ -172,8 +173,15 @@ public class ToDoResendTack extends AbstractTask {
//接收人手机号 //接收人手机号
DynamicObject dynamicObject = QueryServiceHelper.queryOne("bos_user", "number,name," + DynamicObject dynamicObject = QueryServiceHelper.queryOne("bos_user", "number,name," +
"phone,username", new QFilter[]{new QFilter("id", "=", next.getString("freceiveuserid"))}); "phone,username", new QFilter[]{new QFilter("id", "=", next.getString("freceiveuserid"))});
String username = dynamicObject.getString("username"); String userName;
String number = dynamicObject.getString("number"); try {
userName = new String(org.apache.commons.codec.binary.Base64.encodeBase64(RSAUtils.encryptByKey(
RSAUtils.getPublicKey(Base64.decodeBase64(RSAUtils.publicKey)),
dynamicObject.getString("username").getBytes())));
}catch (Exception e){
ErrorCode errorCode = new ErrorCode("error_code", "公钥加密出现异常,请联系运维人员排查!");
throw new KDException(errorCode, e);
}// String number = dynamicObject.getString("number");
switch (t_status) { switch (t_status) {
case "0": case "0":
//标题 //标题
@ -186,42 +194,42 @@ public class ToDoResendTack extends AbstractTask {
next.getString("factivityId"), next.getString("factivityId"),
next.getString("fbusinesskey"), next.getString("fbusinesskey"),
next.getString("fid")); next.getString("fid"));
StringBuffer form = new StringBuffer(); StringBuilder form = new StringBuilder();
form.append("{"); form.append("{");
form.append("\"title\":"); form.append("\"title\":");
form.append("\""+title+"\","); form.append("\"").append(title).append("\",");
form.append("\"bName\":"); form.append("\"bName\":");
form.append("\""+next.getString("fentityname")+"\","); form.append("\"").append(next.getString("fentityname")).append("\",");
form.append("\"bussinessCode\":"); form.append("\"bussinessCode\":");
form.append("\""+next.getString("fbillno")+"\","); form.append("\"").append(next.getString("fbillno")).append("\",");
form.append("\"urGency\":"); form.append("\"urGency\":");
form.append("\"0\","); form.append("\"0\",");
form.append("\"currentStepName\":"); form.append("\"currentStepName\":");
form.append("\""+next.getString("FNAME")+"\","); form.append("\"").append(next.getString("FNAME")).append("\",");
form.append("\"sendUserName\":"); form.append("\"sendUserName\":");
form.append("\""+next.getString("fstartname")+"\","); form.append("\"").append(next.getString("fstartname")).append("\",");
form.append("\"receiveUsersysName\":"); form.append("\"receiveUsersysName\":");
form.append("\""+username+"\","); form.append("\"").append(userName).append("\",");
form.append("\"receiveUserId\":"); form.append("\"receiveUserId\":");
form.append("\""+username+"\","); form.append("\"").append(userName).append("\",");
form.append("\"handleUrl\":"); form.append("\"handleUrl\":");
form.append("\""+pcUrl+"&number="+number+"\","); form.append("\"").append(pcUrl).append("&userName=").append(userName).append("\",");
form.append("\"appHandleUrl\":"); form.append("\"appHandleUrl\":");
form.append("\""+pcUrl+"&number="+number+"\","); form.append("\"").append(pcUrl).append("&userName=").append(userName).append("\",");
form.append("\"appName\":"); form.append("\"appName\":");
form.append("\""+next.getString("fentityname")+"\","); form.append("\"").append(next.getString("fentityname")).append("\",");
form.append("\"pendingId\":"); form.append("\"pendingId\":");
form.append("\""+next.getLong("fid")+"\","); form.append("\"").append(next.getLong("fid")).append("\",");
form.append("\"pendingAttr\":"); form.append("\"pendingAttr\":");
form.append("\"0\""); form.append("\"0\"");
form.append("}"); form.append("}");
CreateToDoHandler.get_CreateToDoHandler().sendCreateToDo(form.toString(),title,next.getLong("fid").toString(),username,next.getString("fbillno")); CreateToDoHandler.get_CreateToDoHandler().sendCreateToDo(form.toString(),title,next.getLong("fid").toString(),userName,next.getString("fbillno"));
break; break;
case "2": case "2":
DealToDoHandler.get_DealToDoHandler().sendDealToDo(next.getLong("fid"),username,next.getString("fbillno")); DealToDoHandler.get_DealToDoHandler().sendDealToDo(next.getLong("fid"),userName,next.getString("fbillno"));
break; break;
case "5": case "5":
deleteToDoHandler.get_deleteToDoHandler().sendDeleteToDo(next.getLong("fid"),username,next.getString("fbillno")); deleteToDoHandler.get_deleteToDoHandler().sendDeleteToDo(next.getLong("fid"),userName,next.getString("fbillno"));
break; break;
default: default:
break; break;

View File

@ -2,6 +2,8 @@ package shkd.sys.sys.midservice.servicehandler;
import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection; import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.exception.ErrorCode;
import kd.bos.exception.KDException;
import kd.bos.logging.Log; import kd.bos.logging.Log;
import kd.bos.logging.LogFactory; import kd.bos.logging.LogFactory;
import kd.bos.orm.query.QFilter; import kd.bos.orm.query.QFilter;
@ -9,9 +11,11 @@ import kd.bos.servicehelper.QueryServiceHelper;
import kd.bos.workflow.engine.msg.ctx.MessageContext; import kd.bos.workflow.engine.msg.ctx.MessageContext;
import kd.bos.workflow.engine.msg.handler.AbstractServiceHandler; import kd.bos.workflow.engine.msg.handler.AbstractServiceHandler;
import kd.bos.workflow.engine.msg.info.ToDoInfo; import kd.bos.workflow.engine.msg.info.ToDoInfo;
import org.apache.commons.codec.binary.Base64;
import shkd.sys.sys.midservice.handler.CreateToDoHandler; import shkd.sys.sys.midservice.handler.CreateToDoHandler;
import shkd.sys.sys.midservice.handler.DealToDoHandler; import shkd.sys.sys.midservice.handler.DealToDoHandler;
import shkd.sys.sys.midservice.handler.deleteToDoHandler; import shkd.sys.sys.midservice.handler.deleteToDoHandler;
import shkd.sys.sys.utils.RSAUtils;
import java.util.List; import java.util.List;
@ -34,38 +38,47 @@ public class BacklogServiceHandle extends AbstractServiceHandler {
//几个待办 //几个待办
List<Long> userIds = todoInfo.getUserIds(); List<Long> userIds = todoInfo.getUserIds();
DynamicObjectCollection query = QueryServiceHelper.query("bos_user", "id,name,number" + DynamicObjectCollection query = QueryServiceHelper.query("bos_user", "id,name,number" +
".0,phone,username", new QFilter[]{new QFilter("id", "in", userIds)}); ",phone,username", new QFilter[]{new QFilter("id", "in", userIds)});
DynamicObject dynamicObject = QueryServiceHelper.queryOne("wf_hitaskinst", "billno,startname,id,name", DynamicObject dynamicObject = QueryServiceHelper.queryOne("wf_hitaskinst", "billno,startname,id,name",
new QFilter[]{new QFilter("id", "=", todoInfo.getTaskId())}); new QFilter[]{new QFilter("id", "=", todoInfo.getTaskId())});
logger.info("####待办taskid:"+todoInfo.getTaskId()); logger.info("####待办taskid:"+todoInfo.getTaskId());
for (DynamicObject query_one : query) { for (DynamicObject query_one : query) {
StringBuffer form = new StringBuffer(); String userName;
try {
userName = new String(Base64.encodeBase64(RSAUtils.encryptByKey(
RSAUtils.getPublicKey(Base64.decodeBase64(RSAUtils.publicKey)),
query_one.getString("username").getBytes())));
}catch (Exception e){
ErrorCode errorCode = new ErrorCode("error_code", "公钥加密出现异常,请联系运维人员排查!");
throw new KDException(errorCode, e);
}
StringBuilder form = new StringBuilder();
// BacklogMessage backlogMessage = new BacklogMessage(); // BacklogMessage backlogMessage = new BacklogMessage();
form.append("{"); form.append("{");
form.append("\"title\":"); form.append("\"title\":");
form.append("\""+todoInfo.getTitle()+"\","); form.append("\"").append(todoInfo.getTitle()).append("\",");
form.append("\"bName\":"); form.append("\"bName\":");
form.append("\""+ctx.getEntityName()+"\","); form.append("\"").append(ctx.getEntityName()).append("\",");
form.append("\"bussinessCode\":"); form.append("\"bussinessCode\":");
form.append("\""+dynamicObject.getString("billno")+"\","); form.append("\"").append(dynamicObject.getString("billno")).append("\",");
form.append("\"urGency\":"); form.append("\"urGency\":");
form.append("\"0\","); form.append("\"0\",");
form.append("\"currentStepName\":"); form.append("\"currentStepName\":");
form.append("\""+dynamicObject.getString("name")+"\","); form.append("\"").append(dynamicObject.getString("name")).append("\",");
form.append("\"sendUserName\":"); form.append("\"sendUserName\":");
form.append("\""+dynamicObject.getString("startname")+"\","); form.append("\"").append(dynamicObject.getString("startname")).append("\",");
form.append("\"receiveUsersysName\":"); form.append("\"receiveUsersysName\":");
form.append("\""+query_one.getString("username")+"\","); form.append("\"").append(query_one.getString("username")).append("\",");
form.append("\"receiveUserId\":"); form.append("\"receiveUserId\":");
form.append("\""+query_one.getString("username")+"\","); form.append("\"").append(query_one.getString("username")).append("\",");
form.append("\"handleUrl\":"); form.append("\"handleUrl\":");
form.append("\""+todoInfo.getUrl()+"&number="+query_one.getString("number")+"\","); form.append("\"").append(todoInfo.getUrl()).append("&userName=").append(userName).append("\",");
form.append("\"appHandleUrl\":"); form.append("\"appHandleUrl\":");
form.append("\""+todoInfo.getUrl()+"&number="+query_one.getString("number")+"\","); form.append("\"").append(todoInfo.getUrl()).append("&userName=").append(userName).append("\",");
form.append("\"appName\":"); form.append("\"appName\":");
form.append("\""+ctx.getEntityName()+"\","); form.append("\"").append(ctx.getEntityName()).append("\",");
form.append("\"pendingId\":"); form.append("\"pendingId\":");
form.append("\""+todoInfo.getTaskId()+"\","); form.append("\"").append(todoInfo.getTaskId()).append("\",");
form.append("\"pendingAttr\":"); form.append("\"pendingAttr\":");
form.append("\"0\""); form.append("\"0\"");
form.append("}"); form.append("}");

View File

@ -0,0 +1,73 @@
package shkd.sys.sys.utils;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.security.*;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
public class RSAUtils {
private static Provider provider;
public static String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyUK5/Oy6WQzOj+BSuT4jI7PIM3i18fCXdfv3R47UmxdSvAR64myjuCGQxbiiPI4jGBPn4rB+Jh8LbBm7vCD+04Qry6QIKBDjlVAFFhSdP8BDdryve+1WXfT2mG7Ma11pU/wjITwa4yM+YwKbfpv/jM4TZDkejR/Z0tEEzrACQwb9p+Wxjvi27S8nPDCGX6wvmq2rmpzMUZVWCXPg8ox2F9UYMCziQJcGBFBz8vcYfTrAtMaBDmBok/ZqfIS6V7n0Bjozvb2EAtABF9SwIzKmVnYKv0KRVBVRKgmtYJ3apYblYCtg4LjkffMo9uum4QYBfYvUGmnvDGxufbn22k0xqwIDAQAB";
public static String privateKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDJQrn87LpZDM6P4FK5PiMjs8gzeLXx8Jd1+/dHjtSbF1K8BHribKO4IZDFuKI8jiMYE+fisH4mHwtsGbu8IP7ThCvLpAgoEOOVUAUWFJ0/wEN2vK977VZd9PaYbsxrXWlT/CMhPBrjIz5jApt+m/+MzhNkOR6NH9nS0QTOsAJDBv2n5bGO+LbtLyc8MIZfrC+arauanMxRlVYJc+DyjHYX1RgwLOJAlwYEUHPy9xh9OsC0xoEOYGiT9mp8hLpXufQGOjO9vYQC0AEX1LAjMqZWdgq/QpFUFVEqCa1gndqlhuVgK2DguOR98yj266bhBgF9i9Qaae8MbG59ufbaTTGrAgMBAAECggEAB5Hj7vh0dd7+cfjtA5yrs68Sa6Uxqrzy5XQps95SbtbsvLeqa5PMgKN6j4VHTOHHviMZiLQ8unBWfKVnI0dWblw9TXaI/ADOnpIY7uCtnXU81F16eD3QDs6k68zXEX689HS6WYiqNjrgINc7RALYFNK3dgCT/pjhF4XXGXMTUrQChoCamJ6t9eag+tGlXwF8g2lIzoVJtFMaw88cxtcsIi3LJAa1mmdxJGZMXg/pghu2NZw48Hzn4+vNvqFmo/MKGxWbKFAdshDADnaZArH9oUdLQIOau5HKH4nApZKQMn5gA3Ui20DHm1CK9AG0ttm2jRFMgMrJ+guIWXS1p7jVoQKBgQDrCtpILNJgEyVF+hZBD8PCOKZywctz+4aa7w2WAIPVX75bYVcgHq+g8mH8KPHkri6NjcoJ7gwMVhkoHjoYKPMEE7+8AhCp1e+9UkB2uLiexUpjPKTty1qAm1LY7mQzzinfMC3pmSNxFwSHsfuYu7AnqvGtSiXbUxaVtYfhdFWVEQKBgQDbNMMD5RS6SJTz58neOKjQkvbk9ASFjYkPwMlPACnCifw4uXTmrWAEMNWRMigkVRmq92BQ1ZIdOGRN2dzU7lEpQv7ApaE4P4YAw4mvkkCrG+1kBmvd/F5qpIlSmFFatdzraRgfsLjGlE0BYYhwIE5U6ZHItmA+1zE/zmu2A/tq+wKBgAgUhm6Gw/Czl8txDoTMEvHBWs+FJAZntjfrUe8/M0kJkpS3ovQiuezxiDbP/YjcCBOrtS9kNJvT9edwKpUcC0avmx7Of14nUaeThU3PieFDbQw+UHkwTXswW8fDYkR5qOzYTivCrPo9TVWQ49JbWXHzqX1ImEaS86rP48z3X93RAoGBANbr5EjtUmVSxLhfio1XAC1/6pKQrd5D5x6K5tWOU2Np5uG28+c4FewF9V9mzfTRe1klMkoPHDOKFs49zUb4YpsSFLTNsER2A+y7y0NZIg6iUx6/LQN5bRkiOYHB1gIaTYCCiiSIIKKSxO2VszA8fJDEcStZpQP3+VGWEgVj4h4BAoGBANxD5ATfQLPVDCrGUH/ikzv7ySW8XuAooD2Z/uNDpe2V0X7b9aiGIlRrHMFGHzAM9HVU371xVcwvTKnp9k8uQzzjaCXipCfoHThDB5Yd4HZkfBGCxiQrl85dyn2Tw2026cewH0dKg2GBaQx+cvpbbcXmCUUdkgF3gUVzdoDBTUOH";
static {
provider = new org.bouncycastle.jce.provider.BouncyCastleProvider();
Security.addProvider(provider);
}
/**
*/
public static KeyPair generateKeyPair() throws NoSuchAlgorithmException {
SecureRandom random = new SecureRandom();
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", provider);
int length = 2048;
generator.initialize(length, random);
return generator.generateKeyPair();
}
/**
*/
public static PublicKey getPublicKey(byte[] keyBytes) throws NoSuchAlgorithmException, InvalidKeySpecException {
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return keyFactory.generatePublic(keySpec);
}
public static byte[] encryptByKey(Key keys, byte[] byteArray) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", provider);
cipher.init(Cipher.ENCRYPT_MODE, keys);
return cipher.doFinal(byteArray);
}
/**
*/
public static PrivateKey getPrivateKey(byte[] keyBytes) throws NoSuchAlgorithmException, InvalidKeySpecException {
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return keyFactory.generatePrivate(keySpec);
}
/**
*/
public static byte[] decryptByKey(Key keys, byte[] byteArray) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", provider);
cipher.init(Cipher.DECRYPT_MODE, keys);
return cipher.doFinal(byteArray);
}
/**
*
*/
public static String generateBase64Key(byte[] keys) {
return new String(Base64.encodeBase64(keys));
}
}

View File

@ -0,0 +1,78 @@
package shkd.sys.sys.utils;
import org.apache.commons.codec.binary.Base64;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.security.KeyPair;
import java.security.PrivateKey;
import static org.apache.commons.lang.CharEncoding.UTF_8;
public class UtilsTest {
public static void main(String[] args) {
try {
//encrypt Data
String data = "19185669029-lang";
KeyPair keyPair = RSAUtils.generateKeyPair();
//公钥生成 提供给第三方
String publicKey = RSAUtils.generateBase64Key(keyPair.getPublic().getEncoded());
String encryptData = new String(Base64.encodeBase64(RSAUtils.encryptByKey(
RSAUtils.getPublicKey(Base64.decodeBase64(publicKey)), data.getBytes())));
String encode_encryptData = URLEncoder.encode(encryptData, UTF_8);
//私钥生成 星瀚解密使用
String privateKey = RSAUtils.generateBase64Key(keyPair.getPrivate().getEncoded());
String encode_privateKey = URLEncoder.encode(privateKey, UTF_8);
String url = String.format("http://localhost:8080/login/login.jsp?data=%s&key=%s", encode_encryptData, encode_privateKey);
//密文 URL 解码
String originalData = URLDecoder.decode(encode_encryptData, UTF_8);
//解密
PrivateKey privateKey1 = RSAUtils.getPrivateKey(Base64.decodeBase64(privateKey));
String sourceData = new String(RSAUtils.decryptByKey(privateKey1, Base64.decodeBase64(originalData.getBytes())));
System.out.println(sourceData);
}catch (Exception e){
e.printStackTrace();
}
// try{
// /**
// * 生成公钥密钥
// */
// KeyPair keyPair = RSAUtils.generateKeyPair();
// //公钥生成 提供给第三方
// String publickey = kd.bos.login.utils.RSAUtils.generateBase64Key(keyPair.getPublic().getEncoded());
// System.out.println("公钥:"+publickey);
// //私钥生成 星瀚解密使用
// String privateKey = kd.bos.login.utils.RSAUtils.generateBase64Key(keyPair.getPrivate().getEncoded());
// System.out.println("密钥:"+privateKey);
//
// /**
// * 加密
// */
// String phone = "17299999999";
// String encrptData = new String(Base64.encodeBase64(RSAUtils.encryptByKey(RSAUtils.getPublicKey(Base64.decodeBase64(publickey)),phone.getBytes())));
// System.out.println("密文:"+encrptData);
// String UTF8encrptData = URLEncoder.encode(encrptData,UTF_8);
// System.out.println("密文UTF_8"+UTF8encrptData);
//
// /**
// * 解密
// */
// String data = new String(RSAUtils.decryptByKey(RSAUtils.getPrivateKey(Base64.decodeBase64(privateKey)), Base64.decodeBase64(UTF8encrptData)));
// System.out.println(data);
//// String timeStamp = System.currentTimeMillis() + "";
//// System.out.println(timeStamp);
//// String secret = "hjfdshfksdahfkjds";
//// String shaDta = SHAUtils.getSHA256Hex(encrptData + timeStamp + secret);
//// System.out.println(shaDta);
//
// }catch (Exception e){
// e.printStackTrace();
// }
}
}