# hello-jasypt **Repository Path**: LessAndfaster/hello-jasypt ## Basic Information - **Project Name**: hello-jasypt - **Description**: jasypt解决SpringBoot项目application配置文件数据库密码上传git暴露问题演示项目 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-04-02 - **Last Updated**: 2024-04-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SpringBoot项目application配置文件数据库密码上传git暴露问题解决方案 # 问题 项目中含有配置文件,配置文件中含有数据库的用户名和密码,上传git直接对外网开放。那后果会怎样可想而知。 # jasypt 加解密 jasypt(Java Simplified Encryption)是一个简化的开源 Java 加密工具库 # Springboot引入jasypt ```xml com.github.ulisesbocchio jasypt-spring-boot-starter 3.0.4 ``` # 加解密测试 ```java @Test public void test1(){ // 参考 https://github.com/ulisesbocchio/jasypt-spring-boot PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); SimpleStringPBEConfig config = new SimpleStringPBEConfig(); // 加密密码 config.setPassword("123456"); // 默认值 // 加密算法 config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256"); // 设置密钥获取迭代次数。在生成加密密钥时,会对密码进行多次迭代操作,以增加密钥的复杂度。 config.setKeyObtentionIterations("1000"); config.setPoolSize("1"); config.setProviderName("SunJCE"); config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator"); config.setStringOutputType("base64"); encryptor.setConfig(config); String encrypt = encryptor.encrypt("hello ..."); System.out.println("加密后: " + encrypt); String decrypt = encryptor.decrypt(encrypt); System.out.println("解密后: " + decrypt); } ``` 输出 ``` 加密后: nOvch7+afYNA0xcbPQq1yzmK0yLj7GmCQR6YpVFH61IkMnTEULVgJz2b2yU3DKbs 解密后: hello ... ``` # springboot使用jasypt 使用很简单,只需要引入jasypt-spring-boot-starter依赖,然后将配置文件中的明文换成"ENC(密文即可)",例如密码为"hello ...",加密密码为"123456",加密之后的密码为"nOvch7+afYNA0xcbPQq1yzmK0yLj7GmCQR6YpVFH61IkMnTEULVgJz2b2yU3DKbs" ```yaml spring: datasource: type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://localhost:3306/scott?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8 username: root password: ENC(nOvch7+afYNA0xcbPQq1yzmK0yLj7GmCQR6YpVFH61IkMnTEULVgJz2b2yU3DKbs) ``` 项目启动时添加启动参数"-Djasypt.encryptor.password=123456" ![image-20240318133938290](http://150.158.33.191/blog/imgs/40/025d660964fd0439befafeced12997451710740378543.png) ![image-20240318134005201](http://150.158.33.191/blog/imgs/40/6bca4f05c77fb14430556cf8aecb303a1710740405420.png) # 原理简单解析 拿到配置信息>判断配置信息是否以"ENC("开头并且以")"结尾,如果是就拿到提取出密文>获取到加解密key>使用jasypt解密密文>将密文替换为明文 注意:在运行环境是可以拿到明文的,例如通过@Value("${spring.datasource.password}")拿到的依然是明文,但在源码级别是看不到明文的,而且加解密密码是通过环境变量提供的,所以即便别人看到密文也解不开,也访问不了我们的数据库. # GIT地址 https://gitee.com/LessAndfaster/hello-jasypt.git # 学习交流 微信:lxwjy88