diff --git a/kernel-d-security/pom.xml b/kernel-d-security/pom.xml index c946276f3..10ec5ecfd 100644 --- a/kernel-d-security/pom.xml +++ b/kernel-d-security/pom.xml @@ -24,6 +24,7 @@ security-sdk-xss security-sdk-request-encrypt-and-decode security-sdk-database-field + security-sdk-guomi security-spring-boot-starter diff --git a/kernel-d-security/security-sdk-guomi/README.md b/kernel-d-security/security-sdk-guomi/README.md new file mode 100644 index 000000000..d1c3b723a --- /dev/null +++ b/kernel-d-security/security-sdk-guomi/README.md @@ -0,0 +1 @@ +# 国密算法封装 \ No newline at end of file diff --git a/kernel-d-security/security-sdk-guomi/pom.xml b/kernel-d-security/security-sdk-guomi/pom.xml new file mode 100644 index 000000000..a73094d21 --- /dev/null +++ b/kernel-d-security/security-sdk-guomi/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + + + cn.stylefeng.roses + kernel-d-security + 8.1.8 + ../pom.xml + + + security-sdk-guomi + + + + + + org.bouncycastle + bcprov-jdk15to18 + ${bcprov.version} + + + + + cn.stylefeng.roses + config-api + ${roses.version} + + + + diff --git a/kernel-d-security/security-sdk-guomi/src/main/java/cn/stylefeng/roses/kernel/security/guomi/GuomiUtil.java b/kernel-d-security/security-sdk-guomi/src/main/java/cn/stylefeng/roses/kernel/security/guomi/GuomiUtil.java new file mode 100644 index 000000000..21ad6d53c --- /dev/null +++ b/kernel-d-security/security-sdk-guomi/src/main/java/cn/stylefeng/roses/kernel/security/guomi/GuomiUtil.java @@ -0,0 +1,48 @@ +package cn.stylefeng.roses.kernel.security.guomi; + +import cn.hutool.crypto.SmUtil; +import cn.hutool.crypto.asymmetric.KeyType; +import cn.hutool.crypto.asymmetric.SM2; +import cn.stylefeng.roses.kernel.security.guomi.expander.GuomiConfigExpander; + +import java.nio.charset.StandardCharsets; + +/** + * 项目中使用的国密算法的封装 + *

+ * 非对称加密和签名:SM2 + * 摘要签名算法:SM3 + * 对称加密:SM4 + * + * @author fengshuonan + * @since 2024/6/25 10:07 + */ +public class GuomiUtil { + + /** + * 国密SM2,公钥加密 + * + * @author fengshuonan + * @since 2024/6/25 10:50 + */ + public static String sm2EncryptWithPublic(String text) { + String sm2PrivateKey = GuomiConfigExpander.getSM2PrivateKey(); + String sm2PublicKey = GuomiConfigExpander.getSM2PublicKey(); + SM2 sm2 = SmUtil.sm2(sm2PrivateKey, sm2PublicKey); + return sm2.encryptBase64(text, StandardCharsets.UTF_8, KeyType.PublicKey); + } + + /** + * 国密SM2,私钥解密 + * + * @author fengshuonan + * @since 2024/6/25 10:53 + */ + public static String sm2DecryptWithPrivate(String encryptedStr) { + String sm2PrivateKey = GuomiConfigExpander.getSM2PrivateKey(); + String sm2PublicKey = GuomiConfigExpander.getSM2PublicKey(); + SM2 sm2 = SmUtil.sm2(sm2PrivateKey, sm2PublicKey); + return sm2.decryptStr(encryptedStr, KeyType.PrivateKey, StandardCharsets.UTF_8); + } + +} diff --git a/kernel-d-security/security-sdk-guomi/src/main/java/cn/stylefeng/roses/kernel/security/guomi/config/GuomiConfigStrategyImpl.java b/kernel-d-security/security-sdk-guomi/src/main/java/cn/stylefeng/roses/kernel/security/guomi/config/GuomiConfigStrategyImpl.java new file mode 100644 index 000000000..afc074bbc --- /dev/null +++ b/kernel-d-security/security-sdk-guomi/src/main/java/cn/stylefeng/roses/kernel/security/guomi/config/GuomiConfigStrategyImpl.java @@ -0,0 +1,49 @@ +package cn.stylefeng.roses.kernel.security.guomi.config; + +import cn.hutool.core.codec.Base64; +import cn.hutool.crypto.SecureUtil; +import cn.stylefeng.roses.kernel.config.api.ConfigInitStrategyApi; +import cn.stylefeng.roses.kernel.config.api.pojo.ConfigInitItem; +import cn.stylefeng.roses.kernel.security.guomi.constants.GuomiConstants; +import org.springframework.stereotype.Component; + +import java.security.KeyPair; +import java.util.ArrayList; +import java.util.List; + +/** + * 国密算法相关秘钥初始化 + * + * @author fengshuonan + * @since 2024/6/25 10:15 + */ +@Component +public class GuomiConfigStrategyImpl implements ConfigInitStrategyApi { + + @Override + public String getTitle() { + return "国密算法配置"; + } + + @Override + public String getDescription() { + return "系统自带国密算法工具的秘钥初始化"; + } + + @Override + public List getInitConfigs() { + + ArrayList configInitItems = new ArrayList<>(); + + // 生成一个公钥私钥对 + KeyPair pair = SecureUtil.generateKeyPair("SM2"); + byte[] publicKey = pair.getPublic().getEncoded(); + configInitItems.add(new ConfigInitItem("国密算法SM2-公钥", GuomiConstants.GUOMI_SM2_PUBLIC_KEY, Base64.encode(publicKey), "国密SM2非对称加密,公钥生成")); + + byte[] privateKey = pair.getPrivate().getEncoded(); + configInitItems.add(new ConfigInitItem("国密算法SM2-私钥", GuomiConstants.GUOMI_SM2_PRIVATE_KEY, Base64.encode(privateKey), "国密SM2非对称加密,私钥生成")); + + return configInitItems; + } + +} diff --git a/kernel-d-security/security-sdk-guomi/src/main/java/cn/stylefeng/roses/kernel/security/guomi/constants/GuomiConstants.java b/kernel-d-security/security-sdk-guomi/src/main/java/cn/stylefeng/roses/kernel/security/guomi/constants/GuomiConstants.java new file mode 100644 index 000000000..ef36150c2 --- /dev/null +++ b/kernel-d-security/security-sdk-guomi/src/main/java/cn/stylefeng/roses/kernel/security/guomi/constants/GuomiConstants.java @@ -0,0 +1,21 @@ +package cn.stylefeng.roses.kernel.security.guomi.constants; + +/** + * 国密算法的常量 + * + * @author fengshuonan + * @since 2024/6/25 10:11 + */ +public interface GuomiConstants { + + /** + * 国密,SM2需要的私钥 + */ + String GUOMI_SM2_PRIVATE_KEY = "GUOMI_SM2_PRIVATE_KEY"; + + /** + * 国密,SM2需要的公钥 + */ + String GUOMI_SM2_PUBLIC_KEY = "GUOMI_SM2_PUBLIC_KEY"; + +} diff --git a/kernel-d-security/security-sdk-guomi/src/main/java/cn/stylefeng/roses/kernel/security/guomi/expander/GuomiConfigExpander.java b/kernel-d-security/security-sdk-guomi/src/main/java/cn/stylefeng/roses/kernel/security/guomi/expander/GuomiConfigExpander.java new file mode 100644 index 000000000..fa8b76cf3 --- /dev/null +++ b/kernel-d-security/security-sdk-guomi/src/main/java/cn/stylefeng/roses/kernel/security/guomi/expander/GuomiConfigExpander.java @@ -0,0 +1,58 @@ +/* + * Copyright [2020-2030] [https://www.stylefeng.cn] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Guns采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Guns源码头部的版权声明。 + * 3.请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://gitee.com/stylefeng/guns + * 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns + * 6.若您的项目无法满足以上几点,可申请商业授权 + */ +package cn.stylefeng.roses.kernel.security.guomi.expander; + +import cn.stylefeng.roses.kernel.config.api.context.ConfigContext; +import cn.stylefeng.roses.kernel.security.guomi.constants.GuomiConstants; + +/** + * 国密算法的配置拓展 + * + * @author fengshuonan + * @since 2024/6/25 10:09 + */ +public class GuomiConfigExpander { + + /** + * SM2,private key + * + * @author fengshuonan + * @since 2024/6/25 10:09 + */ + public static String getSM2PrivateKey() { + return ConfigContext.me().getConfigValue(GuomiConstants.GUOMI_SM2_PRIVATE_KEY, String.class); + } + + /** + * SM2,public key + * + * @author fengshuonan + * @since 2024/6/25 10:09 + */ + public static String getSM2PublicKey() { + return ConfigContext.me().getConfigValue(GuomiConstants.GUOMI_SM2_PUBLIC_KEY, String.class); + } + +} diff --git a/kernel-d-security/security-sdk-request-encrypt-and-decode/pom.xml b/kernel-d-security/security-sdk-request-encrypt-and-decode/pom.xml index 49082a380..1d716691e 100644 --- a/kernel-d-security/security-sdk-request-encrypt-and-decode/pom.xml +++ b/kernel-d-security/security-sdk-request-encrypt-and-decode/pom.xml @@ -17,12 +17,6 @@ - - org.bouncycastle - bcprov-jdk15to18 - ${bcprov.version} - - cn.stylefeng.roses @@ -37,6 +31,13 @@ ${roses.version} + + + cn.stylefeng.roses + security-sdk-guomi + ${roses.version} + + org.springframework.boot