注册
DM8创建外部函数 (JAVA版国密SM3)- 开发篇
技术分享/ 文章详情 /

DM8创建外部函数 (JAVA版国密SM3)- 开发篇

ZCH 2024/11/01 385 0 0

1 概述

为了能够在创建和使用自定义 DMSQL 程序时,使用其他语言实现的接口,DM8 提供了 C、JAVA 外部函数,这样即使外部函数在执行中出现了任何问题,都不会影响到服务器的正常执行。
无论是 C 外部函数还是 JAVA 外部函数,都需要将动态库或 jar 包上传到服务器端或在服务器端编译生成动态库或 jar 包,系统管理员应对动态库和 jar 包进行严格审查,以防止外部函数中包含病毒或恶意代码,引发安全问题。为了保证数据库的安全性和灵活性,DM 提供了 ini 参数 ENABLE_EXTERNAL_CALL 来开关外部函数功能,默认情况下,数据库会关闭外部函数的创建和执行功能。
需要注意的是,DM 不支持 C 或 JAVA 外部函数存放在 ASM 文件系统上的调用。
本文讲述开发JAVA版国密SM3加密函数,生成jar包,提供给达梦数据库创建外部函数使用过程。使用jar包创建外部函数详见:DM8创建外部函数(JAVA版国密SM3)-部署篇。

2 开发环境

开发IDE:MyEclipse
JDK:JAVASE-1.8
第三方包:bcprov-ext-jdk15on-1.58.jar

3 创建SM3算法工具类

package com.dm.crypto;

import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.crypto.macs.HMac;
import org.bouncycastle.crypto.params.KeyParameter;

import java.util.Arrays;

/**

  • SM3算法工具类
    */
    public class SM3Util {

    /**

    • 计算SM3摘要值
    • @param srcData 原文
    • @return 摘要值,对于SM3算法来说是32字节
      */
      public static byte[] hash(byte[] srcData) {
      SM3Digest digest = new SM3Digest();
      digest.update(srcData, 0, srcData.length);
      byte[] hash = new byte[digest.getDigestSize()];
      digest.doFinal(hash, 0);
      return hash;
      }

    /**

    • 验证摘要
    • @param srcData 原文
    • @param sm3Hash 摘要值
    • @return 返回true标识验证成功,false标识验证失败
      */
      public static boolean verify(byte[] srcData, byte[] sm3Hash) {
      byte[] newHash = hash(srcData);
      if (Arrays.equals(newHash, sm3Hash)) {
      return true;
      } else {
      return false;
      }
      }

    /**

    • 计算SM3 Mac值
    • @param key key值,可以是任意长度的字节数组
    • @param srcData 原文
    • @return Mac值,对于HMac-SM3来说是32字节
      */
      public static byte[] hmac(byte[] key, byte[] srcData) {
      KeyParameter keyParameter = new KeyParameter(key);
      SM3Digest digest = new SM3Digest();
      HMac mac = new HMac(digest);
      mac.init(keyParameter);
      mac.update(srcData, 0, srcData.length);
      byte[] result = new byte[mac.getMacSize()];
      mac.doFinal(result, 0);
      return result;
      }
      }

4 创建数据库引用的工具类

package com.dm.crypto;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import org.bouncycastle.util.encoders.Hex;

public class SM3ForDM {
//计算SM3摘要值
public static String getSM3Hash(String originalStr) throws UnsupportedEncodingException {
byte[] hash = SM3Util.hash(originalStr.getBytes(“utf-8”));
return Hex.toHexString(hash);
}

//验证摘要
public static boolean verifySM3Hash(String originalStr, String sm3Hash) throws UnsupportedEncodingException {
byte[] hash = Hex.decode(sm3Hash);
boolean flag = SM3Util.verify(originalStr.getBytes(“utf-8”), hash);
return flag;
}

//计算SM3 Mac值
public static String getHmac(String key, String originalStr) throws UnsupportedEncodingException {
byte[] keyByte = key.getBytes(“utf-8”);
//System.out.println(Arrays.toString(keyByte));
//System.out.println(new String(keyByte));
byte[] srcByte = originalStr.getBytes(“utf-8”);
byte[] hmacByte = SM3Util.hmac(keyByte,srcByte);
return Arrays.toString(hmacByte);
}

}

5 生成jar包

image.png

image.png

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服