一、SM3是什么?
解释:SM3 是一种密码哈希函数,由中国国家密码管理局于2010年发布,是中国国家标准之一。SM3 主要用于数字签名、消息认证码(MAC)以及随机数生成等场景,提供了一种安全的哈希算法。
二、使用步骤
1.先引入依赖
代码如下(示例):
<!--SM3加密-->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
</dependency>
2.编写工具类
建一个SM3Util
public class SM3Util {
// 静态初始化块,用于添加BouncyCastle安全提供者
// 这是因为BouncyCastle提供了对SM3哈希算法的支持
static {
Security.addProvider(new BouncyCastleProvider());
}
/**
* 对给定的数据进行SM3哈希计算
* SM3是中国国家密码管理局发布的密码哈希算法,类似于SHA-256
*
* @param data 待哈希的字符串数据,不能为空
* @return 计算得到的哈希值的十六进制字符串表示
* @throws IllegalArgumentException 如果输入数据为空或为null
*/
public static String hash(String data) {
// 检查输入数据是否为空或为null,如果是,则抛出异常
if (data == null || data.isEmpty()) {
throw new IllegalArgumentException("Data cannot be null or empty");
}
// 创建SM3哈希算法的实例
SM3Digest digest = new SM3Digest();
// 将输入字符串转换为 UTF-8 编码的字节数组
byte[] bytes = data.getBytes(java.nio.charset.StandardCharsets.UTF_8);
// 更新哈希算法的状态,为其提供数据
digest.update(bytes, 0, bytes.length);
// 创建一个字节数组来存储最终的哈希值
byte[] hash = new byte[digest.getDigestSize()];
// 执行哈希计算,将结果存储在hash数组中
digest.doFinal(hash, 0);
// 将字节数组形式的哈希值转换为十六进制字符串并返回
return Hex.toHexString(hash);
}
}
3.业务层使用
注册
@Override
public boolean registerUser(User user) {
// 对密码进行SM3加密
String encryptedPassword = SM3Util.hash(user.getPassword());
user.setPassword(encryptedPassword);
return mapper.registerUser(user);
}
登录时校验
@Override
public User login(User user) {
// 获取用户输入的密码
String encryptedPassword = SM3Util.hash(user.getPassword());
// 从数据库中获取用户信息
User dbUser = mapper.getUserByUserName(user.getUsername());
// 比较密码哈希值
if (dbUser != null && dbUser.getPassword().equals(encryptedPassword)){
return dbUser;
}
return mapper.login(user);
}
getUserByUsername()这个方法需要在mapper定义
@Select("select * from youTableName where username = #{username}")
User getUserByUserName(String username);
总结
SM3 是一种安全高效的哈希算法,适用于多种安全应用。