自从最近L君小弟电脑中毒,疑似私钥泄漏,导致3W u被盗,反观我的程序一直以来裸奔的状态下,再次菊花一紧。
于是,我开始了对Spring Boot的jasypt加密配置的研究。 最坏情况服务器即使被黑,也要尽可能保证程序的安全。
- 配置文件中关键信息: 交易所token,钱包私钥加密;
- jar中yml打包时排除,服务器上用密文配置执行;
- 解密密码动态设置;
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> <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
|