闲碎记事本 闲碎记事本
首页
  • JAVA
  • Cloudflare
  • 学完再改一遍UI
友链
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

YAN

我要偷偷记录...
首页
  • JAVA
  • Cloudflare
  • 学完再改一遍UI
友链
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • java

    • SpringBoot

    • SpringSecurity

    • MybatisPlus

    • Netty

    • sip

      • SIP使用
      • GB28181
      • GB35114
      • SM2工具类
      • SM3工具类
        • 证书构建
        • 使用注解实现XML构建与解析
        • 流媒体服务器
        • FFmpeg
      • 其他

    • linux

    • docker

    • redis

    • nginx

    • mysql

    • 其他

    • 环境搭建

    • 知识库
    • java
    • sip
    YAN
    2024-07-26
    目录

    SM3工具类

    GB35114 SM3 封装 ,基于 bouncycastle 和 hutool-crypto 并结合jain-sip-ri

    # 导入依赖

    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcpkix-jdk18on</artifactId>
        <version>1.78.1</version>
    </dependency>
    
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-crypto</artifactId>
        <version>5.8.24</version>
    </dependency>
    
    <dependency>
        <groupId>javax.sip</groupId>
        <artifactId>jain-sip-ri</artifactId>
        <version>1.3.0-91</version>
    </dependency>
    

    # 说明

    GB35114 摘要算法
    示例:BASE64(SM3(method+from+to+call-id+date+vkek+message))

    # Sm3Util

    查看代码
    
    @Slf4j
    public class Sm3Util {
    
    
        /**
         * 构建 Nonce 值
         *
         * 算法 BASE64(SM3(method+from+to+call-id+date+vkek+message))
         * @param req SIP请求对象
         * @param vkek vkek
         * @param xmlMessage xml内容
         * @return
         */
        public static String genNonce(Request req, String vkek, String xmlMessage){
            SIPRequest request =(SIPRequest) req;
            From fromHeader = (From)request.getFromHeader();
            To toHeader =(To) request.getToHeader();
            CallID callIdHeader =(CallID) request.getCallIdHeader();
            Gb35114SIPDateHeader dateHeader = (Gb35114SIPDateHeader)request.getHeader(Gb35114SIPDateHeader.NAME);
            String method = request.getMethod();
            byte[] bytes = pack(method, fromHeader.getValue(), toHeader.getValue(), callIdHeader.getValue(), dateHeader.getValue(), vkek, xmlMessage);
            return  digest(bytes);
        }
    
    
        /**
         * 构建 Nonce 值
         *
         * 算法 BASE64(SM3(method+from+to+call-id+date+vkek+message))
         * @param resp SI响应对象
         * @param vkek vkek
         * @param xmlMessage xml内容
         * @return
         */
        public static String genNonce(Response resp, String vkek, String xmlMessage){
            SIPResponse response =(SIPResponse) resp;
    
            From fromHeader = (From)response.getFromHeader();
            To toHeader =(To) response.getToHeader();
            CallID callIdHeader =(CallID) response.getCallIdHeader();
            Gb35114SIPDateHeader dateHeader = (Gb35114SIPDateHeader)response.getHeader(Gb35114SIPDateHeader.NAME);
            String method = SipUtils.getResponseMethod(response);
            byte[] bytes = pack(method, fromHeader.getValue(), toHeader.getValue(), callIdHeader.getValue(), dateHeader.getValue(), vkek, xmlMessage);
            return  digest(bytes);
        }
    
        /**
         * 构建数据包
         * 算法 BASE64(SM3(method+from+to+call-id+date+vkek+xmlMessage))
         * @param method SIP请求方法
         * @param from From 头内容
         * @param to To 头内容
         * @param callId Call-Id  头内容
         * @param date Data 头内容
         * @param vkek vkek
         * @param xmlMessage xml内容
         * @return
         */
        public static byte[] pack(String method,String from,String to,String callId,String date,String vkek,String xmlMessage){
            byte[] bytes = method.getBytes(StandardCharsets.UTF_8);
            byte[] bytes1 = from.getBytes(StandardCharsets.UTF_8);
            byte[] bytes2 = to.getBytes(StandardCharsets.UTF_8);
            byte[] bytes3 = callId.getBytes(StandardCharsets.UTF_8);
            byte[] bytes4 = date.getBytes(StandardCharsets.UTF_8);
            byte[] bytes5 = vkek.getBytes(StandardCharsets.UTF_8);
    
            byte[] bytes6 = xmlMessage.getBytes(StandardCharsets.UTF_8);
    
            int size = bytes.length + bytes1.length+bytes2.length+bytes3.length+bytes4.length+bytes5.length+bytes6.length;
            ByteBuffer allocate = ByteBuffer.allocate(size);
            allocate.put(bytes);
            allocate.put(bytes1);
            allocate.put(bytes2);
            allocate.put(bytes3);
            allocate.put(bytes4);
            allocate.put(bytes5);
            allocate.put(bytes6);
    //        log.info("数据长度:{}",size);
            return allocate.array();
        }
    
    
        /**
         * SM3摘要
         * @param data 源数据
         * @return base64编码结果
         */
        public static String digest(byte [] data){
            byte[] digest = new SM3().digest(data);
            return  Base64.encode(digest);
        }
        
    }
    
    
    上次更新: 2025/05/22, 07:52:48
    SM2工具类
    证书构建

    ← SM2工具类 证书构建→

    最近更新
    01
    Caddy操作指南
    04-25
    02
    虚拟机磁盘扩展
    04-22
    03
    Swap空间
    04-22
    更多文章>
    Theme by Vdoing | Copyright © 2022-2025 YAN | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式