接口签名如何使用Java实现

网友投稿 212 2024-02-03


接口签名如何使用Java实现

本文主要介绍"接口签名怎么使用Java实现",希望能够解决您遇到有关问题,下面我们一起来看这篇 "接口签名怎么使用Java实现" 文章。

java实现接口签名

为了保证数据传输的安全性,跟其他系统进行数据交互时,双方应该约定好密钥,把数据进行加密,接口签名,这样双方调用接口时,验证接口签名一致时就表明数据传输过程中没有被修改。

后端数据签名主要代码:

控制器:

@Controller public class SignController {       @Autowired     private ISignService signService;       /**      * 验证接口签名      * @param dto      * @return      */     @RequestMapping("/testSign")     @ResponseBody     public String sign(@RequestBody SignDTO dto) throws Exception{         return signService.testSign(dto);     } }

实现类:

@Service public class SignServiceImpl implements ISignService {       /**      * 获取发起数据请求的签名数据,可以转为json发起请求,服务端再根据接收到的数据进行签名验证,一致则证明数据传输过程中没有被更改。      * @return      * @throws Exception      */     public SignDTO  getSignData() throws Exception{         User user = new User();         user.setName("测试");         user.setSex("男");         String data = JSONUtil.toJsonStr(user);         //密钥         String accessKey = "accessKey";         String secretKey = "secretKey";         String version = "1.0";         int encrypt = 1;         long time = System.currentTimeMillis();         String nonce = RandomUtil.randomString(4);         //本地加签         SignReqParam signReqParam = new SignReqParam(                 accessKey, time, nonce, encrypt, version,                 secretKey, data);         //数据加密         data = EncryptUtils.aesEncrypt(data, EncryptUtils.KEY);         System.out.println("加密后数据:" + data);         SignDTO dto = new SignDTO();         dto.setAccessKey(accessKey);         dto.setVersion(version);         dto.setEncrypt(encrypt);         dto.setNonce(nonce);         dto.setTimestamp(time);         dto.setSign(signReqParam.getSign());         dto.setData(data);         return dto;     }       /**      * 返回json字符串,用于postman进行测试数据      * @return      * @throws Exception      */     public String  getSignDataJson() throws Exception{         SignDTO dto = getSignData();         return JSONUtil.toJsonStr(dto);     }       /**      * 根据接收到的数据,进行验证接口签名,正确再进行数据处理      * @param dto      * @return      */     @Override     public String testSign(SignDTO dto) throws Exception{         String result = "签名不合法";         //密钥         String accessKey = "accessKey";         String secretKey = "secretKey";         String version = "1.0";         int encrypt = 1;         if(ObjectUtils.isEmpty(dto.getVersion()) || !dto.getVersion().equals(version) || ObjectUtils.isEmpty(dto.getData()) || ObjectUtils.isEmpty(dto.getAccessKey()) || !dto.getAccessKey().equals(accessKey)){             return result;         }         // 解密为字符串         String data = EncryptUtils.aesDecrypt(dto.getData(), EncryptUtils.KEY);         System.out.println("解密后数据:" + data);         //本地加签         SignReqParam signReqParam = new SignReqParam(                 accessKey, dto.getTimestamp(), dto.getNonce(), encrypt, version,                 secretKey, data);         //签名对比         if(dto.getSign().equals(signReqParam.getSign())){             User user = JSONUtil.toBean(data, User.class);             System.out.println("接口签名合法,可以处理请求中的用户信息,可以进行一系列数据库操作:" + user.toString());             result = "接口签名合法";         }         return result;     }         public static void main(String[] args) throws Exception {        SignServiceImpl obj = new SignServiceImpl();        SignDTO dto =  obj.getSignData();        String result = obj.testSign(dto);        System.out.println("接口签名结果:" + result);     }

实体类:

@Data public class SignDTO {     /*密钥*/     private String accessKey;     /*密钥*/     private String secretKey;     /*版本*/     private String version;     /*加密*/     private int encrypt;     /*验签参数*/     private String nonce;     /*签名*/     private String sign;     /*数据*/     private String data;     /*时间戳*/     private long timestamp; }@Data public class User implements Serializable {     private String name;       private String sex; }

main方法测试结果:

Connected to the target VM, address: 127.0.0.1:52259, transport: socket 加密后数据:IkoCXfjUX0dawZkLQlqkcex3TJzzQM9VsLg1UuCSvz4= 获取接口请求数据json:{"data":"IkoCXfjUX0dawZkLQlqkcex3TJzzQM9VsLg1UuCSvz4=","accessKey":"accessKey","encrypt":1,"sign":"49EA679C9ED2C49E7FDB7221ECD5784F","version":"1.0","nonce":"oe9w","timestamp":1622972771180} 加密后数据:IkoCXfjUX0dawZkLQlqkcex3TJzzQM9VsLg1UuCSvz4= 解密后数据:{"sex":"男","name":"测试"} 接口签名合法,可以处理请求中的用户信息,可以进行一系列数据库操作:User(name=测试, sex=男) 接口签名结果:接口签名合法 Disconnected from the target VM, address: 127.0.0.1:52259, transport: socket

postman测试结果:

关于

Java编程技术

java如何实现简易的五子棋游戏:本文主要介绍"java怎么实现简易的五子棋游戏",希望能够解决您遇到有关问题,下面我们一起来看这篇 "java怎么实现简易的五子棋游戏" 文章。本文实例为大家分享了java实现简易五子棋游戏的具体代码,供大 ...


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java中如何实施接口
下一篇:Java8中怎么利用Stream实现函数式接口
相关文章

 发表评论

暂时没有评论,来抢沙发吧~