Sfoglia il codice sorgente

响应加密

master
zhao 1 anno fa
parent
commit
72adfb2479
10 ha cambiato i file con 141 aggiunte e 35 eliminazioni
  1. +10
    -0
      README.md
  2. +16
    -1
      agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSApiResult.java
  3. +10
    -0
      agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDK.java
  4. +28
    -2
      agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKClient.java
  5. +23
    -8
      agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKServer.java
  6. +35
    -2
      agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSCrypto.java
  7. +8
    -9
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/agentcenter/AgentCenterController.java
  8. +6
    -0
      ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/object/Result.java
  9. +2
    -1
      ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/service/IAgentCenter.java
  10. +3
    -12
      ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/service/impl/AgentCenterImpl.java

+ 10
- 0
README.md Vedi File

@@ -9,6 +9,16 @@

> 客户端手动导入: ```mvn install:install-file -Dfile=agentcenter-sdk-1.0.0nsgk1.jar -DgroupId=com.nsgk -DartifactId=agentcenter-sdk -Dversion=1.0.0nsgk1 -Dpackaging=jar```

> 客户端依赖:
```
<!--代理中心SDK-->
<dependency>
<groupId>com.nsgk</groupId>
<artifactId>agentcenter-sdk</artifactId>
<version>1.0.0nsgk1</version>
</dependency>
```

---
#### 兼容性
当版本不一致时

+ 16
- 1
agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSApiResult.java Vedi File

@@ -37,6 +37,21 @@ public final class NSApiResult
this.errno = errno;
}

NSApiResult(boolean suc, String msg, Object data)
{
this(suc, msg, data, NSErrno.ERRNO_OK);
}

NSApiResult(boolean suc, String msg, Object data, int errno)
{
this(suc, msg, data, System.currentTimeMillis(), errno);
}

NSApiResult(boolean suc, String msg, Object data, Long timestamp, int errno)
{
this(suc ? NS_RESULT_SUCCESS : NS_RESULT_ERROR, msg, data, timestamp, errno);
}

static NSApiResult Success(String msg, Object data)
{
return new NSApiResult(NS_RESULT_SUCCESS, msg, data);
@@ -56,7 +71,7 @@ public final class NSApiResult
jsonObject.getInteger("code"),
jsonObject.getString("msg"),
jsonObject.containsKey("data") ? jsonObject.get("data") : null,
jsonObject.containsKey("data") ? jsonObject.getLong("timestamp") : null,
jsonObject.containsKey("timestamp") ? jsonObject.getLong("timestamp") : null,
jsonObject.containsKey("errno") ? jsonObject.getInteger("errno") : null
);
}


+ 10
- 0
agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDK.java Vedi File

@@ -58,6 +58,16 @@ public final class NSSDK
return _identifier.get();
}

public static String PrivateKey()
{
return _privateKey.get();
}

public static String PublicKey()
{
return _publicKey.get();
}

public static NSSDKClient InstanceClient()
{
if(!NSConv.FALSE(_clientInit.get()))


+ 28
- 2
agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKClient.java Vedi File

@@ -1,6 +1,8 @@
package com.nsgk.agentcentersdk.api;

import cn.hutool.core.util.URLUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.nsgk.agentcentersdk.core.NSConstants;
import com.nsgk.agentcentersdk.core.NSProtocol;
import com.nsgk.agentcentersdk.core.NSReportObject;
@@ -67,7 +69,7 @@ public final class NSSDKClient
NSNetworkResponse response = NSNetworkManager.Post(request);
NSErrGlobal.ASSERT(response.IsSuccess(), NSErrno.ERRNO_SYS_HTTP);
String json = response.getData();
return NSApiResult.FromJSON(json);
return FromJSON(json);
}

private String BuildUrl(String url)
@@ -87,7 +89,7 @@ public final class NSSDKClient
dataStr = object.getDataStr();
try
{
dataStr = NSCrypto.RSAEncrypt(dataStr, publicKey);
dataStr = NSCrypto.RSAEncrypt_publicKey(dataStr, publicKey);
NSAssert.NotEmpty(dataStr, NSErrno.ERRNO_SYS_ENCRYPT_FAIL);
}
catch(Exception e)
@@ -98,4 +100,28 @@ public final class NSSDKClient
}
request.setData(dataStr);
}

NSApiResult FromJSON(String str)
{
JSONObject jsonObject;

jsonObject = JSON.parseObject(str);
return new NSApiResult(
jsonObject.getInteger("code"),
jsonObject.getString("msg"),
UnwrapClientResponseData(jsonObject.get("data")),
jsonObject.containsKey("timestamp") ? jsonObject.getLong("timestamp") : null,
jsonObject.containsKey("errno") ? jsonObject.getInteger("errno") : NSErrno.ERRNO_OK
);
}

private Object UnwrapClientResponseData(Object data)
{
if(null != data)
{
if(data instanceof String)
data = NSCrypto.RSADecrypt_publicKey((String)data, publicKey);
}
return data;
}
}

+ 23
- 8
agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKServer.java Vedi File

@@ -1,5 +1,6 @@
package com.nsgk.agentcentersdk.api;

import com.alibaba.fastjson2.JSON;
import com.nsgk.agentcentersdk.core.NSConstants;
import com.nsgk.agentcentersdk.core.NSProtocol;
import com.nsgk.agentcentersdk.core.NSReportObject;
@@ -11,7 +12,6 @@ import com.nsgk.agentcentersdk.utility.NSArr;
import com.nsgk.agentcentersdk.utility.NSCrypto;
import com.nsgk.agentcentersdk.utility.NSHttp;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;

// SDK服务端
@@ -55,7 +55,7 @@ public final class NSSDKServer
;
try
{
data = NSCrypto.RSADecrypt(data, privateKey);
data = NSCrypto.RSADecrypt_privateKey(data, privateKey);
NSAssert.NotEmpty(data, NSErrno.ERRNO_SYS_DECRYPT_FAIL);
res.SetDataStr(data, clazz);
NSErrGlobal.ASSERT(res.getData().Normalized() == 0, NSErrno.ERRNO_SYS_INVALID_FIELD);
@@ -83,19 +83,34 @@ public final class NSSDKServer
}

// 响应客户端
public static NSApiResult Resp(int code, String msg, Object...data)
public NSApiResult Resp(boolean success, String msg, Object...data)
{
return new NSApiResult(code, msg, NSArr.DefParm(data));
return new NSApiResult(success, msg, WrapClientResponseData(data));
}

public static NSApiResult Success(String msg, Object...data)
public NSApiResult Resp(int errno, String msg, Object...data)
{
return NSApiResult.Success(msg, NSArr.DefParm(data));
return new NSApiResult(errno == NSErrno.ERRNO_OK, msg, WrapClientResponseData(data), errno);
}

public static NSApiResult Fail(int errno, String msg, Object...data)
public NSApiResult Success(String msg, Object...data)
{
return NSApiResult.Error(errno, msg, NSArr.DefParm(data));
return NSApiResult.Success(msg, WrapClientResponseData(data));
}

public NSApiResult Fail(int errno, String msg, Object...data)
{
return NSApiResult.Error(errno, msg, WrapClientResponseData(data));
}

private Object WrapClientResponseData(Object...data)
{
Object o = NSArr.DefParm(data);
if(null != o)
{
if(!(o instanceof String))
o = NSCrypto.RSAEncrypt_privateKey(JSON.toJSONString(o), privateKey);
}
return o;
}
}

+ 35
- 2
agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSCrypto.java Vedi File

@@ -9,10 +9,21 @@ import cn.hutool.crypto.asymmetric.RSA;
import java.nio.charset.StandardCharsets;

// 加密工具
// 加密数据返回都为base64, 解密数据传参都为base64
// 客户端存放公钥, 服务端存放私钥
/*
/ ---------> \
公钥加密 \ / -> 私钥解密
/ \ / \
客户端 服务端 处理/返回响应
\ / \ /
公钥解密 / \ <- 私钥加密
\ <--------- /
*/
public final class NSCrypto
{
// RSA公钥加密(客户端) raw -> base64
public static String RSAEncrypt(String rawData, String publicKey_base64)
public static String RSAEncrypt_publicKey(String rawData, String publicKey_base64)
{
RSA rsa;

@@ -23,7 +34,7 @@ public final class NSCrypto
}

// RSA私钥解密(服务端) base64 -> raw
public static String RSADecrypt(String encryptBase64Data, String privateKey_base64)
public static String RSADecrypt_privateKey(String encryptBase64Data, String privateKey_base64)
{
RSA rsa;

@@ -33,5 +44,27 @@ public final class NSCrypto
return StrUtil.str(rsa.decrypt(Base64.decode(encryptBase64Data), KeyType.PrivateKey), StandardCharsets.UTF_8);
}

// RSA私钥加密(服务端) raw -> base64
public static String RSAEncrypt_privateKey(String rawData, String privateKey_base64)
{
RSA rsa;

if(NSStr.IsEmpty(rawData) || NSStr.IsEmpty(privateKey_base64))
return "";
rsa = SecureUtil.rsa(privateKey_base64, null);
return rsa.encryptBase64(rawData, KeyType.PrivateKey);
}

// RSA公钥解密(客户端) base64 -> raw
public static String RSADecrypt_publicKey(String encryptBase64Data, String publicKey_base64)
{
RSA rsa;

if(NSStr.IsEmpty(encryptBase64Data) || NSStr.IsEmpty(publicKey_base64))
return "";
rsa = SecureUtil.rsa(null, publicKey_base64);
return StrUtil.str(rsa.decrypt(Base64.decode(encryptBase64Data), KeyType.PublicKey), StandardCharsets.UTF_8);
}

private NSCrypto() {}
}

+ 8
- 9
ruoyi-admin/src/main/java/com/ruoyi/web/controller/agentcenter/AgentCenterController.java Vedi File

@@ -53,23 +53,22 @@ public class AgentCenterController extends BaseController
@PostMapping("/report")
public NSApiResult report(HttpServletRequest request)
{
NSSDKServer server;

NSSDK.InitServer(RuoYiConfig.Secret.privateKey);
server = NSSDK.InstanceServer();
try
{
Result<?> result = agentCenter.postHandle(request);
return response(result);
Result<?> result = agentCenter.postHandle(server, request);
return server.Resp(result.getCode(), result.getMessage(), result.getData());
}
catch(NSException e)
{
return NSSDKServer.Fail(e.getErrno(), e.getMessage());
return server.Fail(e.getErrno(), e.getMessage());
}
catch(Exception e)
{
return NSSDKServer.Fail(NSErrno.ERRNO_ERROR, e.getMessage());
return server.Fail(NSErrno.ERRNO_ERROR, e.getMessage());
}
}

private NSApiResult response(Result<?> result)
{
return NSSDKServer.Resp(result.getCode(), result.getMessage(), result.getData());
}
}

+ 6
- 0
ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/object/Result.java Vedi File

@@ -1,5 +1,6 @@
package com.ruoyi.agentcenter.object;

import com.nsgk.agentcentersdk.err.NSErrno;
import lombok.Data;
import lombok.experimental.Accessors;

@@ -11,4 +12,9 @@ public class Result<R>
private int code;
private String message;
private R data;

public boolean IsSuccess()
{
return code == NSErrno.ERRNO_OK;
}
}

+ 2
- 1
ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/service/IAgentCenter.java Vedi File

@@ -1,10 +1,11 @@
package com.ruoyi.agentcenter.service;

import com.nsgk.agentcentersdk.api.NSSDKServer;
import com.ruoyi.agentcenter.object.Result;

import javax.servlet.http.HttpServletRequest;

public interface IAgentCenter
{
public Result<?> postHandle(HttpServletRequest request);
public Result<?> postHandle(NSSDKServer server, HttpServletRequest request);
}

+ 3
- 12
ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/service/impl/AgentCenterImpl.java Vedi File

@@ -1,8 +1,6 @@
package com.ruoyi.agentcenter.service.impl;

import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.URLUtil;
import com.nsgk.agentcentersdk.api.NSSDK;
import com.nsgk.agentcentersdk.api.NSSDKServer;
import com.nsgk.agentcentersdk.core.NSProtocol;
import com.nsgk.agentcentersdk.core.NSReportObject;
@@ -16,17 +14,13 @@ import com.ruoyi.agentcenter.object.Message;
import com.ruoyi.agentcenter.object.Result;
import com.ruoyi.agentcenter.object.Session;
import com.ruoyi.agentcenter.service.IAgentCenter;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.utils.EventBusEngine;
import com.ruoyi.common.utils.handler.HandlerEngine;
import com.ruoyi.system.mapper.SysDeptMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import java.net.URL;
import java.util.Date;

@Service
public class AgentCenterImpl implements IAgentCenter
@@ -45,14 +39,11 @@ public class AgentCenterImpl implements IAgentCenter
return protocol;
}

public Message<?> getMessage(HttpServletRequest request)
public Message<?> getMessage(NSSDKServer server, HttpServletRequest request)
{
NSSDKServer server;
NSReportObject<?> reportObject;
Message<?> message;

NSSDK.InitServer(RuoYiConfig.Secret.privateKey);
server = NSSDK.InstanceServer();
int protocol = getProtocol(request);
Class<? extends NSEntity> clazz;
switch(protocol)
@@ -113,9 +104,9 @@ public class AgentCenterImpl implements IAgentCenter
}

@Override
public Result<?> postHandle(HttpServletRequest request)
public Result<?> postHandle(NSSDKServer server, HttpServletRequest request)
{
Message<?> message = getMessage(request);
Message<?> message = getMessage(server, request);
check(message, request);
Session<?, ?> session = createSession(message);
HandlerEngine.Post(session);


Caricamento…
Annulla
Salva