Compare commits

...

3 Commits

Author SHA1 Message Date
李佳航
534fe83ac2 Merge pull request #86 from dromara/hotfix
merge
2025-01-22 22:59:57 +08:00
lijiahangmax
d95d958de0 🔖 升级版本. 2025-01-22 22:40:28 +08:00
lijiahangmax
4e5730f31f 🐛 修复加密失败的问题. 2025-01-22 22:32:10 +08:00
19 changed files with 72 additions and 72 deletions

View File

@@ -1,5 +1,5 @@
#/bin/bash #/bin/bash
version=2.3.0 version=2.3.1
docker build -t orion-visor-adminer:${version} . docker build -t orion-visor-adminer:${version} .
docker tag orion-visor-adminer:${version} registry.cn-hangzhou.aliyuncs.com/orionsec/orion-visor-adminer:${version} docker tag orion-visor-adminer:${version} registry.cn-hangzhou.aliyuncs.com/orionsec/orion-visor-adminer:${version}
docker tag orion-visor-adminer:${version} registry.cn-hangzhou.aliyuncs.com/orionsec/orion-visor-adminer:latest docker tag orion-visor-adminer:${version} registry.cn-hangzhou.aliyuncs.com/orionsec/orion-visor-adminer:latest

View File

@@ -1,5 +1,5 @@
#/bin/bash #/bin/bash
version=2.3.0 version=2.3.1
cp -r ../../sql ./sql cp -r ../../sql ./sql
docker build -t orion-visor-mysql:${version} . docker build -t orion-visor-mysql:${version} .
rm -rf ./sql rm -rf ./sql

View File

@@ -1,5 +1,5 @@
#/bin/bash #/bin/bash
version=2.3.0 version=2.3.1
docker push registry.cn-hangzhou.aliyuncs.com/orionsec/orion-visor-adminer:${version} docker push registry.cn-hangzhou.aliyuncs.com/orionsec/orion-visor-adminer:${version}
docker push registry.cn-hangzhou.aliyuncs.com/orionsec/orion-visor-mysql:${version} docker push registry.cn-hangzhou.aliyuncs.com/orionsec/orion-visor-mysql:${version}
docker push registry.cn-hangzhou.aliyuncs.com/orionsec/orion-visor-redis:${version} docker push registry.cn-hangzhou.aliyuncs.com/orionsec/orion-visor-redis:${version}

View File

@@ -1,5 +1,5 @@
#/bin/bash #/bin/bash
version=2.3.0 version=2.3.1
docker build -t orion-visor-redis:${version} . docker build -t orion-visor-redis:${version} .
docker tag orion-visor-redis:${version} registry.cn-hangzhou.aliyuncs.com/orionsec/orion-visor-redis:${version} docker tag orion-visor-redis:${version} registry.cn-hangzhou.aliyuncs.com/orionsec/orion-visor-redis:${version}
docker tag orion-visor-redis:${version} registry.cn-hangzhou.aliyuncs.com/orionsec/orion-visor-redis:latest docker tag orion-visor-redis:${version} registry.cn-hangzhou.aliyuncs.com/orionsec/orion-visor-redis:latest

View File

@@ -1,5 +1,5 @@
#/bin/bash #/bin/bash
version=2.3.0 version=2.3.1
mv ../../orion-visor-launch/target/orion-visor-launch.jar ./orion-visor-launch.jar mv ../../orion-visor-launch/target/orion-visor-launch.jar ./orion-visor-launch.jar
mv ../../orion-visor-ui/dist ./dist mv ../../orion-visor-ui/dist ./dist
docker build --no-cache -t orion-visor-service:${version} . docker build --no-cache -t orion-visor-service:${version} .

View File

@@ -36,7 +36,7 @@ public interface AppConst extends OrionConst {
/** /**
* 同 ${orion.version} 迭代时候需要手动更改 * 同 ${orion.version} 迭代时候需要手动更改
*/ */
String VERSION = "2.3.0"; String VERSION = "2.3.1";
/** /**
* 同 ${spring.application.name} * 同 ${spring.application.name}

View File

@@ -23,21 +23,13 @@
package org.dromara.visor.common.interfaces; package org.dromara.visor.common.interfaces;
/** /**
* rsa 密器 * rsa 密器
* *
* @author Jiahang Li * @author Jiahang Li
* @version 1.0.0 * @version 1.0.0
* @since 2025/1/5 20:58 * @since 2025/1/5 20:58
*/ */
public interface RsaEncryptor { public interface RsaDecryptor {
/**
* 加密
*
* @param value value
* @return value
*/
String encrypt(String value);
/** /**
* 解密 * 解密

View File

@@ -23,30 +23,20 @@
package org.dromara.visor.common.utils; package org.dromara.visor.common.utils;
import cn.orionsec.kit.lang.utils.Exceptions; import cn.orionsec.kit.lang.utils.Exceptions;
import org.dromara.visor.common.interfaces.RsaEncryptor; import org.dromara.visor.common.interfaces.RsaDecryptor;
/** /**
* rsa 密工具类 * rsa 参数解密工具类
* *
* @author Jiahang Li * @author Jiahang Li
* @version 1.0.0 * @version 1.0.0
* @since 2025/1/5 21:13 * @since 2025/1/5 21:13
*/ */
public class RsaEncryptUtils { public class RsaParamDecryptUtils {
private static RsaEncryptor delegate; private static RsaDecryptor delegate;
private RsaEncryptUtils() { private RsaParamDecryptUtils() {
}
/**
* 加密
*
* @param value value
* @return value
*/
public static String encrypt(String value) {
return delegate.encrypt(value);
} }
/** /**
@@ -59,12 +49,12 @@ public class RsaEncryptUtils {
return delegate.decrypt(value); return delegate.decrypt(value);
} }
public static void setDelegate(RsaEncryptor delegate) { public static void setDelegate(RsaDecryptor delegate) {
if (RsaEncryptUtils.delegate != null) { if (RsaParamDecryptUtils.delegate != null) {
// unmodified // unmodified
throw Exceptions.state(); throw Exceptions.state();
} }
RsaEncryptUtils.delegate = delegate; RsaParamDecryptUtils.delegate = delegate;
} }
} }

View File

@@ -14,7 +14,7 @@
<url>https://github.com/dromara/orion-visor</url> <url>https://github.com/dromara/orion-visor</url>
<properties> <properties>
<revision>2.3.0</revision> <revision>2.3.1</revision>
<spring.boot.version>2.7.17</spring.boot.version> <spring.boot.version>2.7.17</spring.boot.version>
<spring.boot.admin.version>2.7.15</spring.boot.admin.version> <spring.boot.admin.version>2.7.15</spring.boot.admin.version>
<flatten.maven.plugin.version>1.5.0</flatten.maven.plugin.version> <flatten.maven.plugin.version>1.5.0</flatten.maven.plugin.version>

View File

@@ -25,12 +25,12 @@ package org.dromara.visor.framework.encrypt.configuration;
import org.dromara.visor.common.config.ConfigStore; import org.dromara.visor.common.config.ConfigStore;
import org.dromara.visor.common.constant.AutoConfigureOrderConst; import org.dromara.visor.common.constant.AutoConfigureOrderConst;
import org.dromara.visor.common.interfaces.AesEncryptor; import org.dromara.visor.common.interfaces.AesEncryptor;
import org.dromara.visor.common.interfaces.RsaEncryptor; import org.dromara.visor.common.interfaces.RsaDecryptor;
import org.dromara.visor.common.utils.AesEncryptUtils; import org.dromara.visor.common.utils.AesEncryptUtils;
import org.dromara.visor.common.utils.RsaEncryptUtils; import org.dromara.visor.common.utils.RsaParamDecryptUtils;
import org.dromara.visor.framework.encrypt.configuration.config.AesEncryptConfig; import org.dromara.visor.framework.encrypt.configuration.config.AesEncryptConfig;
import org.dromara.visor.framework.encrypt.core.impl.AesEncryptorImpl; import org.dromara.visor.framework.encrypt.core.impl.AesEncryptorImpl;
import org.dromara.visor.framework.encrypt.core.impl.RsaEncryptorImpl; import org.dromara.visor.framework.encrypt.core.impl.RsaDecryptorImpl;
import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.AutoConfigureOrder; import org.springframework.boot.autoconfigure.AutoConfigureOrder;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
@@ -63,15 +63,15 @@ public class OrionEncryptAutoConfiguration {
/** /**
* @param configStore configStore * @param configStore configStore
* @return rsa 密器 * @return rsa 参数解密器
*/ */
@Bean @Bean
public RsaEncryptor rsaEncryptor(ConfigStore configStore) { public RsaDecryptor rsaParamDecryptor(ConfigStore configStore) {
// 密器 // 密器
RsaEncryptor encryptor = new RsaEncryptorImpl(configStore); RsaDecryptor decryptor = new RsaDecryptorImpl(configStore);
// 设置工具类 // 设置工具类
RsaEncryptUtils.setDelegate(encryptor); RsaParamDecryptUtils.setDelegate(decryptor);
return encryptor; return decryptor;
} }
} }

View File

@@ -26,10 +26,11 @@ import cn.orionsec.kit.lang.utils.crypto.RSA;
import org.dromara.visor.common.config.ConfigRef; import org.dromara.visor.common.config.ConfigRef;
import org.dromara.visor.common.config.ConfigStore; import org.dromara.visor.common.config.ConfigStore;
import org.dromara.visor.common.constant.ConfigKeys; import org.dromara.visor.common.constant.ConfigKeys;
import org.dromara.visor.common.interfaces.RsaEncryptor; import org.dromara.visor.common.interfaces.RsaDecryptor;
import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey; import java.util.Arrays;
import java.util.stream.Collectors;
/** /**
* rsa 加密器 * rsa 加密器
@@ -38,25 +39,21 @@ import java.security.interfaces.RSAPublicKey;
* @version 1.0.0 * @version 1.0.0
* @since 2025/1/7 11:32 * @since 2025/1/7 11:32
*/ */
public class RsaEncryptorImpl implements RsaEncryptor { public class RsaDecryptorImpl implements RsaDecryptor {
private final ConfigRef<RSAPublicKey> publicKey; private static final String SPLIT = "\\|";
private final ConfigRef<RSAPrivateKey> privateKey; private final ConfigRef<RSAPrivateKey> privateKey;
public RsaEncryptorImpl(ConfigStore configStore) { public RsaDecryptorImpl(ConfigStore configStore) {
this.publicKey = configStore.ref(ConfigKeys.ENCRYPT_PUBLIC_KEY, RSA::getPublicKey);
this.privateKey = configStore.ref(ConfigKeys.ENCRYPT_PRIVATE_KEY, RSA::getPrivateKey); this.privateKey = configStore.ref(ConfigKeys.ENCRYPT_PRIVATE_KEY, RSA::getPrivateKey);
} }
@Override
public String encrypt(String value) {
return RSA.encrypt(value, publicKey.value);
}
@Override @Override
public String decrypt(String value) { public String decrypt(String value) {
return RSA.decrypt(value, privateKey.value); return Arrays.stream(value.split(SPLIT))
.map(s -> RSA.decrypt(s, privateKey.value))
.collect(Collectors.joining());
} }
} }

View File

@@ -28,7 +28,7 @@ import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import org.dromara.visor.common.constant.ErrorMessage; import org.dromara.visor.common.constant.ErrorMessage;
import org.dromara.visor.common.utils.RsaEncryptUtils; import org.dromara.visor.common.utils.RsaParamDecryptUtils;
import org.dromara.visor.common.utils.Valid; import org.dromara.visor.common.utils.Valid;
import java.io.IOException; import java.io.IOException;
@@ -51,7 +51,7 @@ public class ParamDecryptDeserializer extends JsonDeserializer<String> {
return value; return value;
} }
// 解密参数 // 解密参数
String decrypt = RsaEncryptUtils.decrypt(value); String decrypt = RsaParamDecryptUtils.decrypt(value);
return Valid.notNull(decrypt, ErrorMessage.DECRYPT_ERROR); return Valid.notNull(decrypt, ErrorMessage.DECRYPT_ERROR);
} }

View File

@@ -39,9 +39,9 @@ import java.util.function.Function;
*/ */
public class ReplaceVersion { public class ReplaceVersion {
private static final String TARGET_VERSION = "2.2.3"; private static final String TARGET_VERSION = "2.3.0";
private static final String REPLACE_VERSION = "2.3.0"; private static final String REPLACE_VERSION = "2.3.1";
private static final String PATH = new File("").getAbsolutePath(); private static final String PATH = new File("").getAbsolutePath();

View File

@@ -29,7 +29,7 @@ import org.dromara.visor.common.constant.Const;
import org.dromara.visor.common.constant.ErrorMessage; import org.dromara.visor.common.constant.ErrorMessage;
import org.dromara.visor.common.handler.data.strategy.AbstractGenericsDataStrategy; import org.dromara.visor.common.handler.data.strategy.AbstractGenericsDataStrategy;
import org.dromara.visor.common.utils.AesEncryptUtils; import org.dromara.visor.common.utils.AesEncryptUtils;
import org.dromara.visor.common.utils.RsaEncryptUtils; import org.dromara.visor.common.utils.RsaParamDecryptUtils;
import org.dromara.visor.common.utils.Valid; import org.dromara.visor.common.utils.Valid;
import org.dromara.visor.module.asset.dao.HostIdentityDAO; import org.dromara.visor.module.asset.dao.HostIdentityDAO;
import org.dromara.visor.module.asset.dao.HostKeyDAO; import org.dromara.visor.module.asset.dao.HostKeyDAO;
@@ -134,7 +134,7 @@ public class HostSshConfigStrategy extends AbstractGenericsDataStrategy<HostSshC
// 检查新密码 // 检查新密码
String newPassword = Valid.notBlank(after.getPassword(), ErrorMessage.PASSWORD_MISSING); String newPassword = Valid.notBlank(after.getPassword(), ErrorMessage.PASSWORD_MISSING);
// 解密密码 // 解密密码
newPassword = RsaEncryptUtils.decrypt(newPassword); newPassword = RsaParamDecryptUtils.decrypt(newPassword);
Valid.notBlank(newPassword, ErrorMessage.DECRYPT_ERROR); Valid.notBlank(newPassword, ErrorMessage.DECRYPT_ERROR);
// 设置密码 // 设置密码
after.setPassword(AesEncryptUtils.encryptAsString(newPassword)); after.setPassword(AesEncryptUtils.encryptAsString(newPassword));

View File

@@ -3,4 +3,4 @@ VITE_API_BASE_URL=http://127.0.0.1:9200/orion-visor/api
# websocket 路径 # websocket 路径
VITE_WS_BASE_URL=ws://127.0.0.1:9200/orion-visor/keep-alive VITE_WS_BASE_URL=ws://127.0.0.1:9200/orion-visor/keep-alive
# 版本号 # 版本号
VITE_APP_VERSION=2.3.0 VITE_APP_VERSION=2.3.1

View File

@@ -3,4 +3,4 @@ VITE_API_BASE_URL=/orion-visor/api
# websocket 路径 # websocket 路径
VITE_WS_BASE_URL=/orion-visor/keep-alive VITE_WS_BASE_URL=/orion-visor/keep-alive
# 版本号 # 版本号
VITE_APP_VERSION=2.3.0 VITE_APP_VERSION=2.3.1

View File

@@ -1,7 +1,7 @@
{ {
"name": "orion-visor-ui", "name": "orion-visor-ui",
"description": "Orion Visor UI", "description": "Orion Visor UI",
"version": "2.3.0", "version": "2.3.1",
"private": true, "private": true,
"author": "Jiahang Li", "author": "Jiahang Li",
"license": "Apache 2.0", "license": "Apache 2.0",

View File

@@ -2,6 +2,9 @@ import { JSEncrypt } from 'jsencrypt';
import { useCacheStore } from '@/store'; import { useCacheStore } from '@/store';
import { Message } from '@arco-design/web-vue'; import { Message } from '@arco-design/web-vue';
// 分块大小
const BLOCK_SIZE = 100;
// 加密 // 加密
export const encrypt = async (data: string | undefined): Promise<string | undefined> => { export const encrypt = async (data: string | undefined): Promise<string | undefined> => {
// 为空直接返回 // 为空直接返回
@@ -9,14 +12,32 @@ export const encrypt = async (data: string | undefined): Promise<string | undefi
return data; return data;
} }
// 获取公钥 // 获取公钥
const { encrypt } = await useCacheStore().loadSystemSetting(); const publicKey = (await useCacheStore().loadSystemSetting()).encrypt?.publicKey;
const encryptor = new JSEncrypt(); const encryptor = new JSEncrypt();
encryptor.setPublicKey(encrypt?.publicKey); encryptor.setPublicKey(publicKey);
// 加密
const value = encryptor.encrypt(data); try {
if (value === false) { // 分块加密
const chunks = splitString(data);
const encryptedChunks = chunks.map(chunk => {
const encrypted = encryptor.encrypt(chunk);
if (encrypted === false) {
throw new Error();
}
return encrypted;
});
return encryptedChunks.join('|');
} catch (error) {
Message.error('数据加密失败'); Message.error('数据加密失败');
throw new Error('数据加密失败'); throw new Error('数据加密失败');
} }
return value; };
// 分割字符串
const splitString = (str: string): string[] => {
const chunks: string[] = [];
for (let i = 0; i < str.length; i += BLOCK_SIZE) {
chunks.push(str.slice(i, i + BLOCK_SIZE));
}
return chunks;
}; };

View File

@@ -22,7 +22,7 @@
</modules> </modules>
<properties> <properties>
<revision>2.3.0</revision> <revision>2.3.1</revision>
<maven.compiler.source>8</maven.compiler.source> <maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target> <maven.compiler.target>8</maven.compiler.target>
<maven.surefire.plugin.version>3.0.0-M5</maven.surefire.plugin.version> <maven.surefire.plugin.version>3.0.0-M5</maven.surefire.plugin.version>