IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 工作记录:使用hutool工具包为项目更换报文加密方式 -> 正文阅读

[网络协议]工作记录:使用hutool工具包为项目更换报文加密方式

项目最初采用RSA报文加密方式,由于临时需求要将RSA改为国密算法,然后就是我的踩坑之路:

首先,国密算法会用到hutool-all-xxx.jar和bcprov-jdk15on-xxx.jar两个jar包;

这里需要注意:hutool工具包会存在和jdk版本兼容的问题,博主使用的hutool-all-4.6.3需要jdk1.7+的支持,5.x则需要jdk1.8+的支持.

需要了解其他详情可以访问hutool的官网:Hutool — 🍬A set of tools that keep Java sweet.

废话不多说上代码:

public class Sm4Util{
//otherPublickey    对手公匙
//otherPrivatekey   对手私匙
//ownPublickey      己方公匙
//ownPrivatekey     己方私匙

//在两个系统进行加密数据互传时,己方是不可能获取对方的私匙的,同样对方不可能获取己方私匙
//例如,我用对方公匙加密后的内容发送给对手系统时,对方可以用他的私匙解密

    //对传来的内容进行加签加密
    public static String deliver(String msg,String otherPublickey,String ownPublickey){
        return encryptAndSign(msg,otherPublickey,ownPublickey);
    }

    //对传来的内容进行解签解密
    public static String receive(String msg,String ownPrivatekey,String otherPublickey){
        return checkSigAndDecrypt(msg,ownPrivatekey,otherPublickey);
    }
    
     //验签和解密
    public static String checkSignAndDecrypt(String msg,String ownPrivatekey,String 
    otherPublickey) throws AlipayApiException {
        System.out.println("接收到的原始密文:"+msg);
        if(!isBlank(msg)){//判断非空
            Element e = XmlUtils.getRootElementFromString(msg);
            //String content = XmlUtils.getElementValue(e, "response");
            String corpCode = XmlUtils.getElementValue(e, "corpCode");
            String sign = XmlUtils.getElementValue(e, "sign");
            //先解外层非对称加密,用私钥
            SM2 sm21 = SmUtil.sm2(ownPrivatekey,null);
            String sm21decryptStr= sm21.decryptStr(sign, KeyType.PrivateKey);
            System.out.println("解除外层后"+sm21decryptStr);
            //再解内层对称加密,
            String sSM4Key11 = otherPublickey.substring(0,16);
            SymmetricCrypto sm41 = SmUtil.sm4(sSM4Key11.getBytes());
            String  contentDecryptstr = sm41.decryptStr(sm21decryptStr);

            System.out.println("解密解签后----"+contentDecryptstr);
            System.out.println(contentDecryptstr);
            return contentDecryptstr;

        }
        return null;

    }
    //加签加密 这里因为报文是xml格式,所以加上了xml的标签,对手才能成功接收,懒得删了,无视即可
    public static String encryptAndSign(String msg, String             
    otherPublickey,String ownPublickey) throws AlipayApiException {

        System.out.println("对称加密加签前数据:"+msg);
        StringBuilder sb = new StringBuilder();
        if(!isBlank(msg)){
            sb.append("<?xml version=\"1.0\" encoding=\"" + "UTF-8" + "\"?>");
            sb.append("<lziig>");
            //用我方公钥的前16位字符加密内层
            String sSM4Key = ownPublickey.substring(0,16);
            SymmetricCrypto sm4 = SmUtil.sm4(sSM4Key.getBytes());
            String sSM4encrypt = sm4.encryptHex(msg,"UTF-8");
            sb.append("<response></response>");
            sb.append("<encryption_type>SM4</encryption_type>");
            //通过对方公钥获取非对称加密外层
            SM2 sm2 = SmUtil.sm2(null,otherPublickey);
            //用完整的对方公钥加密数据
            String sendJson = sm2.encryptHex(sSM4encrypt, KeyType.PublicKey);
            sb.append("<sign>" + sendJson + "</sign>");
            sb.append("<sign_type>SM2</sign_type>");
            sb.append("</lziig>");
        }
        return sb.toString();
    }

    public static boolean isBlank(String str) {
        int strLen;
        if (str != null && (strLen = str.length()) != 0) {
            for(int i = 0; i < strLen; ++i) {
                if (!Character.isWhitespace(str.charAt(i))) {
                    return false;
                }
            }

            return true;
        } else {
            return true;
        }
    }
    
}

我将上面的代码在我项目中封装成了一个工具类,在需要用的地方直接调用对应方法,同理在服务端也可以添加一个类似工具类,这里的类是为了模仿客户端,测试能否正常加密发送和接收解密报文.

最重要的点便是,用对方公匙加密,对方接收到后要用他自己的私匙加密,对方用我方公匙加密,我方接受时用自己的私匙解密即可,当然这是针对非对称加密,如果是对称加密,那么情况又不一样,就会变成用什么加密就用什么解密,所以如此看来加密还有什么意义呢?

如有纰漏,还请各位老师指出错误.

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-11-30 15:58:44  更:2021-11-30 16:01:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年7日历 -2024/7/6 8:33:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码