diff --git a/common/src/main/java/com/jeesite/common/codec/DigestUtils.java b/common/src/main/java/com/jeesite/common/codec/DigestUtils.java
index 60012644..56c1b806 100644
--- a/common/src/main/java/com/jeesite/common/codec/DigestUtils.java
+++ b/common/src/main/java/com/jeesite/common/codec/DigestUtils.java
@@ -4,15 +4,13 @@
*/
package com.jeesite.common.codec;
+import com.jeesite.common.lang.ExceptionUtils;
+import org.apache.commons.lang3.Validate;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+
import java.io.IOException;
import java.io.InputStream;
-import java.security.GeneralSecurityException;
-import java.security.MessageDigest;
-import java.security.SecureRandom;
-
-import org.apache.commons.lang3.Validate;
-
-import com.jeesite.common.lang.ExceptionUtils;
+import java.security.*;
/**
* 不可逆加密工具类
@@ -20,11 +18,15 @@ import com.jeesite.common.lang.ExceptionUtils;
*/
public class DigestUtils {
- private static SecureRandom random = new SecureRandom();
+ public static final String SHA1 = "SHA-1";
+ public static final String MD5 = "MD5";
+ public static final String SM3 = "SM3";
+
+ private static final SecureRandom random = new SecureRandom();
/**
- * 生成随机的Byte[]作为salt密钥.
- * @param numBytes byte数组的大小
+ * 生成随机的 Byte[] 作为 salt 密钥.
+ * @param numBytes byte 数组的大小
*/
public static byte[] genSalt(int numBytes) {
Validate.isTrue(numBytes > 0, "numBytes argument must be a positive integer (1 or larger)", numBytes);
@@ -32,25 +34,41 @@ public class DigestUtils {
random.nextBytes(bytes);
return bytes;
}
+
+ /**
+ * 生成随机的 Byte[] 作为 salt 密钥,返回 HEX 值
+ * @param numBytes byte 数组的大小
+ */
+ public static String genSaltString(int numBytes) {
+ return EncodeUtils.encodeHex(genSalt(numBytes));
+ }
+
+ /**
+ * 获取 MessageDigest
+ */
+ private static MessageDigest getMessageDigest(String algorithm) throws GeneralSecurityException {
+ if (SM3.equals(algorithm)) {
+ return MessageDigest.getInstance(algorithm, BouncyCastleProvider.PROVIDER_NAME);
+ } else {
+ return MessageDigest.getInstance(algorithm);
+ }
+ }
/**
* 对字符串进行散列, 支持md5与sha1算法.
* @param input 需要散列的字符串
- * @param algorithm 散列算法("SHA-1"、"MD5")
- * @param salt
+ * @param algorithm 散列算法("SHA-1"、"MD5"、"SM3")
+ * @param salt 可为空
* @param iterations 迭代次数
* @return
*/
public static byte[] digest(byte[] input, String algorithm, byte[] salt, int iterations) {
try {
- MessageDigest digest = MessageDigest.getInstance(algorithm);
-
+ MessageDigest digest = getMessageDigest(algorithm);
if (salt != null) {
digest.update(salt);
}
-
byte[] result = digest.digest(input);
-
for (int i = 1; i < iterations; i++) {
digest.reset();
result = digest.digest(result);
@@ -64,20 +82,18 @@ public class DigestUtils {
/**
* 对文件进行sha1散列.
* @param input 需要散列的流
- * @param algorithm 散列算法("SHA-1"、"MD5")
+ * @param algorithm 散列算法("SHA-1"、"MD5"、"SM3")
*/
public static byte[] digest(InputStream input, String algorithm) throws IOException {
try {
- MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
+ MessageDigest messageDigest = getMessageDigest(algorithm);
int bufferLength = 8 * 1024;
byte[] buffer = new byte[bufferLength];
int read = input.read(buffer, 0, bufferLength);
-
while (read > -1) {
messageDigest.update(buffer, 0, read);
read = input.read(buffer, 0, bufferLength);
}
-
return messageDigest.digest();
} catch (GeneralSecurityException e) {
throw ExceptionUtils.unchecked(e);
diff --git a/common/src/main/java/com/jeesite/common/codec/EncodeUtils.java b/common/src/main/java/com/jeesite/common/codec/EncodeUtils.java
index c88954f8..c2bcca5a 100644
--- a/common/src/main/java/com/jeesite/common/codec/EncodeUtils.java
+++ b/common/src/main/java/com/jeesite/common/codec/EncodeUtils.java
@@ -26,11 +26,11 @@ import java.util.regex.Pattern;
/**
* 封装各种格式的编码解码工具类.
- * 1.Commons-Codec的 hex/base64 编码
- * 2.自制的base62 编码
- * 3.Commons-Lang的xml/html escape
- * 4.JDK提供的URLEncoder
- * 5、XSS、SQL、orderBy 过滤器
+ * 1. Commons-Codec 的 hex/base64 编码
+ * 2. 自制的 base62 编码
+ * 3. Commons-Lang 的 xml/html escape
+ * 4. JDK 提供的 URLEncoder
+ * 5. XSS、SQL、orderBy 过滤器
* @author calvin、ThinkGem
* @version 2022-2-17
*/
@@ -304,38 +304,4 @@ public class EncodeUtils {
return null;
}
-// public static void main(String[] args) {
-// xssFilter("1 你好 我还在。");
-// xssFilter("2 你好 加粗文字我还在。");
-// xssFilter("3 你好 \">加粗文字我还在。");
-// xssFilter("4 你好 加粗文字我还在。");
-// xssFilter("5 你好