Carry-Coin 中 Jasypt 的应用

自从最近L君小弟电脑中毒,疑似私钥泄漏,导致3W u被盗,反观我的程序一直以来裸奔的状态下,再次菊花一紧。
于是,我开始了对Spring Boot的jasypt加密配置的研究。 最坏情况服务器即使被黑,也要尽可能保证程序的安全。

  1. 配置文件中关键信息: 交易所token,钱包私钥加密;
  2. jar中yml打包时排除,服务器上用密文配置执行;
  3. 解密密码动态设置;

jasypt 集成

程序引入

pom.xml

1
2
3
4
5
 <dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>

application.yml

1
2
3
jasypt:
encryptor:
password: ${JASYPT_ENCRYPTOR_PASSWORD}

Application.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* <p> @Date : 2023/3/19 </p>
* <p> @author konbluesky </p>
*/
@SpringBootApplication(scanBasePackages = "com.block")
@EnableScheduling
@EnableAsync
@EnableJpaAuditing
// WARN bad smell
@EncryptablePropertySources({
@EncryptablePropertySource(value = "file:./config/application.yml",ignoreResourceNotFound = true),
@EncryptablePropertySource(value = "classpath:application.yml",ignoreResourceNotFound = true)

})
@EnableEncryptableProperties
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

打包排除

pom.xml,设置打包时排除yml文件,避免铭文yml误打包到jar中

1
2
3
4
5
6
7
8
9
10
11
12
 <resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
<!-- 用springboot 打包时 排除yml-->
<excludes>
<exclude>**/*.yml</exclude>
</excludes>
</resource>
</resources>

启动脚本

原启动方式需要通过-Djasypt.encryptor.password=”the password”,来设置加密密码。这种方式用jps -mlv可以看到启动命令,但是这种方式不安全,依然容易泄露密码。
为了安全起见,我们需要在启动脚本中设置环境变量 JASYPT_ENCRYPTOR_PASSWORD 来加密配置文件中的敏感信息。设置后又担心环境变量被echo出来,所以需要设置环境变量时,需要隐藏输入内容
同时控制变量作用域在shell内部;

最终脚本如下,关键语句是export和unset;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/bin/bash

# 获取当前脚本所在目录的绝对路径
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"

# 进入脚本所在目录
cd "$SCRIPT_DIR"


# 提示用户输入 JASYPT_ENCRYPTOR_PASSWORD,并隐藏输入内容
read -sp "Enter App password: " JASYPT_PASSWORD
echo

export JASYPT_ENCRYPTOR_PASSWORD=$JASYPT_PASSWORD
# 检查是否输入了 JASYPT_ENCRYPTOR_PASSWORD
if [ -z "$JASYPT_PASSWORD" ]; then
echo "jasypt.encryptor.password is required."
exit 1
fi


# 启动Java程序并使用nohup确保它在后台运行
nohup java -jar $(ls -t trade-monitor-*.jar | head -1) \
--spring.config.location=file:./config/ \
--spring.application.name=gateio\
-XX:+PrintGCDetails \
-XX:+PrintGCDateStamps \
-Xloggc:$SCRIPT_DIR/gc.log \
-Xmx16G \
-Xms8G \
-XX:+UseG1GC \
-XX:NewRatio=3 \
-XX:SurvivorRatio=8 \
-XX:MaxMetaspaceSize=1024M \
-XX:MaxGCPauseMillis=200 \
-Xss1M >/dev/null 2>&1 &

# 清除环境变量
unset JASYPT_ENCRYPTOR_PASSWORD

Author

Gavin

Posted on

2024-07-13

Updated on

2024-07-17

Licensed under

Comments