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 -----------------------