返回顶部
首页 > 资讯 > 后端开发 > JAVA >国密SM4算法加密解密实现以及与Spring Security集成实现
  • 249
分享到

国密SM4算法加密解密实现以及与Spring Security集成实现

springjava数据库 2023-09-11 10:09:39 249人浏览 泡泡鱼
摘要

目录 简介 项目集成 引入依赖 测试 编写 PasswordEncoder 定义SM4PasswordEncoder 配置文件定义 properties类 注册为Bean 密码加密 简介 项目中要求密码加密算法使用国家的密码标准SM4.

目录

简介

项目集成

引入依赖

测试

编写 PasswordEncoder

定义SM4PasswordEncoder

配置文件定义

properties类

注册为Bean

密码加密


简介

项目中要求密码加密算法使用国家的密码标准SM4.0,下面来介绍下。

SM4算法是我国发布的商用密码算法中的分组密码算法,是一种迭代分组密码算法,由加解密算法和密钥扩展算法组成。其分组长度和密钥长度均为128比特,加密算法和密钥扩展算法迭代轮数均为32轮。SM4加解密过程的算法相同但是轮密钥的使用顺序相反。SM4算法具有安全高效的功能特点,在设计和实现方面具有一定的优势。

项目集成

在项目中登录以及鉴权使用的是spring Security,与框架的集成如下。

引入依赖

首先需要引入如下两个依赖

            cn.hutool            hutool-all            ${hutool.version}                                    org.bouncycastle            bcprov-jdk15to18            ${bcprov.version}        

测试

工具类中可以使用如下方法自行测试加密效果

public static void main(String[] args) {    try {        //自定义秘钥        String key = "6gsx@654hs68456!";        String passWord="123456";        SymmetricCrypto crypto = SmUtil.sm4(key.getBytes());        String s2 = crypto.encryptHex(password);        String s3 = crypto.decryptStr(s2);        System.out.println(s2);        System.out.println(s3);        //用工具类生成,此处使用随机秘钥,加解密需要使用同一个示例才可得到原始密码        SM4 sm4 = SmUtil.sm4();    } catch (Exception e) {        throw new RuntimeException(e);    }}

编写 PasswordEncoder

Spring Security默认支持的密码算法如下:

public static PasswordEncoder createDelegatingPasswordEncoder() {String encodingId = "bcrypt";Map encoders = new HashMap<>();encoders.put(encodingId, new BCryptPasswordEncoder());encoders.put("ldap", new org.springframework.security.crypto.password.LdapShaPasswordEncoder());encoders.put("MD4", new org.springframework.security.crypto.password.Md4PasswordEncoder());encoders.put("MD5", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("MD5"));encoders.put("noop", org.springframework.security.crypto.password.NoOpPasswordEncoder.getInstance());encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());encoders.put("scrypt", new SCryptPasswordEncoder());encoders.put("SHA-1", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("SHA-1"));encoders.put("SHA-256",new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("SHA-256"));encoders.put("sha256", new org.springframework.security.crypto.password.StandardPasswordEncoder());encoders.put("arGon2", new Argon2PasswordEncoder());return new DelegatingPasswordEncoder(encodingId, encoders);}

在我们集成登录时候,会将登录的密码与用户的密码作比较,因此我们需要自定义一个新的PasswordEncoder来替换掉默认的。

定义SM4PasswordEncoder

public class SM4PasswordEncoder implements PasswordEncoder {    private final SymmetricCrypto sm4;    public SM4PasswordEncoder(String key) {        SymmetricCrypto crypto = SmUtil.sm4(key.getBytes());        this.sm4 = crypto;    }    @Override    public String encode(CharSequence rawPassword) {        return sm4.encryptHex(rawPassword.toString());    }    @Override    public boolean matches(CharSequence rawPassword, String encodedPassword) {        return sm4.encryptHex(rawPassword.toString()).equals(encodedPassword);    }}

matches方法即会在登录时调用此方法比较。

配置文件定义

因为我们需要自定义一个加密的秘钥,在实际项目中我们根据实际情况灵活配置,所以我们定义一个配置文件 application-sm4.yml

te  system:     sm4-key: z^cnmuop2372a375

注意: key的秘钥位数需要是 16因为   128位/8 = 16

properties类

@Data@Component@ConfigurationProperties(prefix = "te.system")public class SystemEnvProperties {       @NotNull    @apiModelProperty(notes = "sm4加密秘钥-需要16byte")    private String sm4Key;  }

注册为Bean

       @Bean    public PasswordEncoder passwordEncoder(SystemEnvProperties envProperties) {        return new SM4PasswordEncoder(envProperties.getSm4Key());    }

密码加密

在创建用户及修改密码时候,调用加密方法

  @Autowired    private PasswordEncoder passwordEncoder;userInfo.setPassword(passwordEncoder.encode(vo.getPassword()));

至此,集成完成

来源地址:https://blog.csdn.net/yu619251940/article/details/128037440

--结束END--

本文标题: 国密SM4算法加密解密实现以及与Spring Security集成实现

本文链接: https://www.lsjlt.com/news/402924.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作