diff --git a/sa-token-core/pom.xml b/sa-token-core/pom.xml
index c2fe3fc9..ff351897 100644
--- a/sa-token-core/pom.xml
+++ b/sa-token-core/pom.xml
@@ -3,7 +3,19 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
-
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 8
+ 8
+
+
+
+
+
cn.dev33
sa-token-parent
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/application/SaApplication.java b/sa-token-core/src/main/java/cn/dev33/satoken/application/SaApplication.java
index e52b284f..ab5e9ebc 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/application/SaApplication.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/application/SaApplication.java
@@ -34,7 +34,7 @@ public class SaApplication implements SaSetValueInterface {
/**
* 默认实例
*/
- public static SaApplication defaultInstance = new SaApplication();
+ public final static SaApplication defaultInstance = new SaApplication();
// ---- 实现接口存取值方法
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/basic/SaBasicUtil.java b/sa-token-core/src/main/java/cn/dev33/satoken/basic/SaBasicUtil.java
index e5a327d2..40d68521 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/basic/SaBasicUtil.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/basic/SaBasicUtil.java
@@ -29,7 +29,7 @@ public class SaBasicUtil {
/**
* 底层使用的 SaBasicTemplate 对象
*/
- public static SaBasicTemplate saBasicTemplate = new SaBasicTemplate();
+ public final static SaBasicTemplate saBasicTemplate = new SaBasicTemplate();
/**
* 获取浏览器提交的 Basic 参数 (裁剪掉前缀并解码)
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfigFactory.java b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfigFactory.java
index 7018a917..8ed42171 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfigFactory.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfigFactory.java
@@ -42,7 +42,7 @@ public class SaTokenConfigFactory {
/**
* 配置文件地址
*/
- public static String configPath = "sa-token.properties";
+ public final static String configPath = "sa-token.properties";
/**
* 根据 configPath 路径获取配置信息
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/context/SaTokenContextForThreadLocalStorage.java b/sa-token-core/src/main/java/cn/dev33/satoken/context/SaTokenContextForThreadLocalStorage.java
index 177244db..791532c5 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/context/SaTokenContextForThreadLocalStorage.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/context/SaTokenContextForThreadLocalStorage.java
@@ -34,7 +34,7 @@ public class SaTokenContextForThreadLocalStorage {
/**
* 基于 ThreadLocal 的 [ Box 存储器 ]
*/
- public static ThreadLocal boxThreadLocal = new InheritableThreadLocal<>();
+ public static final ThreadLocal boxThreadLocal = new InheritableThreadLocal<>();
/**
* 初始化当前线程的 [ Box 存储器 ]
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/dao/SaTokenDaoDefaultImpl.java b/sa-token-core/src/main/java/cn/dev33/satoken/dao/SaTokenDaoDefaultImpl.java
index dc9cbae7..cf1090ab 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/dao/SaTokenDaoDefaultImpl.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/dao/SaTokenDaoDefaultImpl.java
@@ -34,12 +34,12 @@ public class SaTokenDaoDefaultImpl implements SaTokenDao {
/**
* 存储数据的集合
*/
- public Map dataMap = new ConcurrentHashMap<>();
+ public final Map dataMap = new ConcurrentHashMap<>();
/**
* 存储数据过期时间的集合(单位: 毫秒), 记录所有 key 的到期时间 (注意存储的是到期时间,不是剩余存活时间)
*/
- public Map expireMap = new ConcurrentHashMap<>();
+ public final Map expireMap = new ConcurrentHashMap<>();
/**
* 构造函数
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/error/SaErrorCode.java b/sa-token-core/src/main/java/cn/dev33/satoken/error/SaErrorCode.java
index 4ba440d7..5d516637 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/error/SaErrorCode.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/error/SaErrorCode.java
@@ -154,6 +154,12 @@ public interface SaErrorCode {
/** sha256 加密异常 */
int CODE_12113 = 12113;
+ /** sha384 加密异常 */
+ int CODE_121131 = 121131;
+
+ /** sha512 加密异常 */
+ int CODE_121132 = 121132;
+
/** AES 加密异常 */
int CODE_12114 = 12114;
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/secure/SaSecureUtil.java b/sa-token-core/src/main/java/cn/dev33/satoken/secure/SaSecureUtil.java
index 51304287..e0b83ad5 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/secure/SaSecureUtil.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/secure/SaSecureUtil.java
@@ -31,6 +31,7 @@ import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.HashMap;
+import java.util.Objects;
import java.util.UUID;
/**
@@ -91,20 +92,8 @@ public class SaSecureUtil {
public static String sha1(String str) {
try {
str = (str == null ? "" : str);
- MessageDigest md = MessageDigest.getInstance("SHA1");
- byte[] b = str.getBytes();
- md.update(b);
- byte[] b2 = md.digest();
- int len = b2.length;
- String strA = "0123456789abcdef";
- char[] ch = strA.toCharArray();
- char[] chs = new char[len * 2];
- for (int i = 0, k = 0; i < len; i++) {
- byte b3 = b2[i];
- chs[k++] = ch[b3 >>> 4 & 0xf];
- chs[k++] = ch[b3 & 0xf];
- }
- return new String(chs);
+ MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
+ return getShaHexString(str, messageDigest);
} catch (Exception e) {
throw new SaTokenException(e).setCode(SaErrorCode.CODE_12112);
}
@@ -120,25 +109,67 @@ public class SaSecureUtil {
try {
str = (str == null ? "" : str);
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
- messageDigest.update(str.getBytes(StandardCharsets.UTF_8));
-
- byte[] bytes = messageDigest.digest();
- StringBuilder builder = new StringBuilder();
- String temp;
- for (byte aByte : bytes) {
- temp = Integer.toHexString(aByte & 0xFF);
- if (temp.length() == 1) {
- builder.append("0");
- }
- builder.append(temp);
- }
-
- return builder.toString();
+ return getShaHexString(str, messageDigest);
} catch (Exception e) {
throw new SaTokenException(e).setCode(SaErrorCode.CODE_12113);
}
}
+ /**
+ * sha384加密
+ *
+ * @param str 指定字符串
+ * @return 加密后的字符串
+ */
+ public static String sha384(String str) {
+ try {
+ str = (str == null ? "" : str);
+ MessageDigest messageDigest = MessageDigest.getInstance("SHA-384");
+ return getShaHexString(str, messageDigest);
+ } catch (Exception e) {
+ throw new SaTokenException(e).setCode(SaErrorCode.CODE_121131);
+ }
+ }
+
+ /**
+ * sha512加密
+ *
+ * @param str 指定字符串
+ * @return 加密后的字符串
+ */
+ public static String sha512(String str) {
+ try {
+ str = (str == null ? "" : str);
+ MessageDigest messageDigest = MessageDigest.getInstance("SHA-512");
+ return getShaHexString(str, messageDigest);
+ } catch (Exception e) {
+ throw new SaTokenException(e).setCode(SaErrorCode.CODE_121132);
+ }
+ }
+
+ /**
+ * sha (Secure Hash Algorithm)加密 公共方法
+ *
+ * @param str 指定字符串
+ * @param messageDigest 消息摘要
+ * @return 加密后的字符串
+ */
+ private static String getShaHexString(String str, MessageDigest messageDigest) {
+ messageDigest.update(str.getBytes(StandardCharsets.UTF_8));
+ byte[] bytes = messageDigest.digest();
+ StringBuilder builder = new StringBuilder();
+ String temp;
+ for (byte aByte : bytes) {
+ temp = Integer.toHexString(aByte & 0xFF); // 获取无符号整数十六进制字符串
+ if (temp.length() == 1) {
+ builder.append("0"); // 确保每个字节都用两个字符表示
+ }
+ builder.append(temp);
+ }
+
+ return builder.toString();
+ }
+
/**
* md5加盐加密: md5(md5(str) + md5(salt))
* @param str 字符串
@@ -149,6 +180,15 @@ public class SaSecureUtil {
return md5(md5(str) + md5(salt));
}
+ /**
+ * sha256加盐加密: sha256(sha256(str) + sha256(salt))
+ * @param str 字符串
+ * @param salt 盐
+ * @return 加密后的字符串
+ */
+ public static String sha256BySalt(String str, String salt) {
+ return sha256(sha256(str) + sha256(salt));
+ }
// ----------------------- 对称加密 AES -----------------------