如何加密配置文件里的敏感数据信息,如何加密配置文件里的敏感数据删除
00-1010加密配置文件中敏感数据的一般步骤(引入依赖项)测试修改后的yml配置文件的第一种方法是可行的,第二种方法是测试可行性的最终总结。
00-1010项目开发时,需要将数据存储在指定的数据库中(如MySql、Oracle等。),并且会使用一些缓存数据库来提高性能。
与数据库相关的信息一般存储在配置文件中,spring boot会帮助我们将其注入到特定的对象中。但是,如果配置文件中的相关敏感信息是以[明文]形式存储的,那么就会存在安全隐患。
今天,我碰巧想起是否可以对敏感信息进行加密,然后写入配置文件。结果真的有,所以请记录下来!
00-1010 groupIdcom.github.ulisesbocchio/groupId artifactidjaspyt-Spring-Boot-Starter/artifactid version 3 . 0 . 3/version/dependency的依赖关系数据库信息
Redis缓存信息
修改配置文件并添加密钥。
00-1010 server 3360 port 3360 9091 jasy pt 3360 encryptor 3360 #指定加密密码password 3360 wxzkjtvvgt @ 44 lvvzspring 3360 data source 3360 URL 3360 JDBC 3360 MySQL 3360//127 . 0 . 0 . 1:33333 server time zone=UTC driver-class-name : com . MySQL
目录
@ Test void testen crypt(){ final String redistencrypt=stringen cryptor . encrypt( 127 . 0 . 0 . 1 );final String resupasswordencrypt=String encryptor . encrypt( iamamg );最终字符串mysqlUrl=stringen cryptor . encrypt( JDBC : MySQL ://127 . 0 . 0 . 1:3306/encryp?server time zone=UTC );最终字符串MySQL username=String encryptor . encrypt( root );最终字符串MySQL password=stringen cryptor . encrypt( root 1234 );system . out . println(============================);//用这些加密信息替换配置文件中的相关配置项system . out . println( redisthost encrypt: redisthostencrypt );System.out.println(redis密码加密: resupasswordencrypt );System.out.println(mysql用户名加密: mysql用户名);System.out.println(mysql密码加密: MySQL password );system . out . println( mysqurl加密: mysqurl );system . out . println(=============================);system . out . println( redis host decryption: String encryptor . decrypt(redisthostencrypt));System.out.printl
n("redis密码解密:" + stringEncryptor.decrypt(redisPasswordEncrypt)); System.out.println("mysql用户名解密:" + stringEncryptor.decrypt(mysqlUserName)); System.out.println("mysql密码解密:" + stringEncryptor.decrypt(mysqlPassword)); System.out.println("mysqlUrl解密:" + stringEncryptor.decrypt(mysqlUrl)); }==================================redis主机加密:V5FeblAg4MRY+TEkmBlSZzgK74CTIyPPnrkcpUibYFMxbEHtmPWduLxdHpgFn3Gwredis密码加密:0aP2oNj2IrXA9bl6HygZQESEy82dWccigQ5Fic474y8f3pyDNxRIdA+C5SjHsKEYmysql用户名加密:cTPlLHJqZcchsnd0N9gZWGpFcfAFS0EwFwT0foYPXqxA9ngXfNtCUoR7rLvPfYRFmysql密码加密:/J2IBQyk8aydeBKL6E553ffxanVE660uuNOzUrNlVMEcrejy70Sen0MKkXc7szQ0mysqlUrl加密:NvHXbj9LhVamadZSyXfB/Alsg+XuICiJUKTC/dl92lDEF0gcHoIi1Fd0HOxGOEBydgnyNdyK0cnDC0vyC0k+e5AR9Cr8VYDUMdALMr+85Ar4XrPZ0ZICYAsox84fSMdb===================================redis主机解密:127.0.0.1redis密码解密:iamamgmysql用户名解密:rootmysql密码解密:root1234mysqlUrl解密:jdbc:mysql://127.0.0.1:3306/encryp?serverTimezone=UTC
修改后的yml配置文件
可能你也观察到了,需要额外注意的一点就是,需要加密的数据项都使用了ENC()括起来了
server: port: 9091jasypt: encryptor: # 加密密码 password: wxzkjtvvgt@44lvvzspring: datasource: url: ENC(NvHXbj9LhVamadZSyXfB/Alsg+XuICiJUKTC/dl92lDEF0gcHoIi1Fd0HOxGOEBydgnyNdyK0cnDC0vyC0k+e5AR9Cr8VYDUMdALMr+85Ar4XrPZ0ZICYAsox84fSMdb) driver-class-name: com.mysql.cj.jdbc.Driver password: ENC(/J2IBQyk8aydeBKL6E553ffxanVE660uuNOzUrNlVMEcrejy70Sen0MKkXc7szQ0) username: ENC(cTPlLHJqZcchsnd0N9gZWGpFcfAFS0EwFwT0foYPXqxA9ngXfNtCUoR7rLvPfYRF) application: name: test-encrypt redis: port: 6379 host: ENC(V5FeblAg4MRY+TEkmBlSZzgK74CTIyPPnrkcpUibYFMxbEHtmPWduLxdHpgFn3Gw) password: ENC(0aP2oNj2IrXA9bl6HygZQESEy82dWccigQ5Fic474y8f3pyDNxRIdA+C5SjHsKEY)
测试是否可行
/** * 测试获取数据库中的数据总量 */ @Test void testSelectInMysql() { String sql = "SELECT COUNT(1) FROM T0001_TEST"; final Integer num = jdbcTemplate.queryForObject(sql, Integer.class); System.out.println(num); } /** * 测试获取redis中指定key */ @Test void testSelectInRedis() { final String name = redisTemplate.opsForValue().get("name"); System.out.println(name); }
但是,大家且思考一下,我们当前yml配置文件里面依然存在着密钥,这是不是很不合理?只要解读到这个文件,密钥还是会被知道,所以这里提供另外一种做法
第二种做法
1.首先把yml文件里面的密钥记录下来,然后把配置去掉(其实就是把这个配置移到运行的时候才指定)
启动的时候加上-Djasypt.encryptor.password= 密钥 ;这里的密钥为 wxzkjtvvgt@44lvvz,如果密钥错误,项目是启动不成功的,通常报的错都是数据库连接失败,这也挺正常的,因为如果是错误的密钥,密文信息就无法解密,得到的自然是不符合的信息,所以会报错
# 就把关于密钥的部分移除,其他依旧不变server: port: 9091spring: datasource: url: ENC(NvHXbj9LhVamadZSyXfB/Alsg+XuICiJUKTC/dl92lDEF0gcHoIi1Fd0HOxGOEBydgnyNdyK0cnDC0vyC0k+e5AR9Cr8VYDUMdALMr+85Ar4XrPZ0ZICYAsox84fSMdb) driver-class-name: com.mysql.cj.jdbc.Driver password: ENC(/J2IBQyk8aydeBKL6E553ffxanVE660uuNOzUrNlVMEcrejy70Sen0MKkXc7szQ0) username: ENC(cTPlLHJqZcchsnd0N9gZWGpFcfAFS0EwFwT0foYPXqxA9ngXfNtCUoR7rLvPfYRF) application: name: test-encrypt redis: port: 6379 host: ENC(V5FeblAg4MRY+TEkmBlSZzgK74CTIyPPnrkcpUibYFMxbEHtmPWduLxdHpgFn3Gw) password: ENC(0aP2oNj2IrXA9bl6HygZQESEy82dWccigQ5Fic474y8f3pyDNxRIdA+C5SjHsKEY)
2.在IDEA里面启动程序的方式
3.打成jar包,命令行启动的方式
最终还是测试是否可行
此时模拟真实的三层开发
//controller代码 /** * @Author: Amg * @Date: Created in 17:45 2021/04/17 * @Description: TODO */@RestControllerpublic class TestController { @Autowired TestServiceImpl service; @GetMapping("/count") public String getCount() { final Integer count = service.getCount(); if (StringUtils.isEmpty(count)) { return "连接数据库出问题了"; } else { return "连接数据库成功!当前数据量为:" + count; } }}
//service代码/** * @Author: Amg * @Date: Created in 17:46 2021/04/17 * @Description: TODO */@Servicepublic class TestServiceImpl { @Autowired private JdbcTemplate jdbcTemplate; public Integer getCount() { try { String sql = "SELECT COUNT(1) FROM T0001_TEST"; return jdbcTemplate.queryForObject(sql, Integer.class); } catch (DataAccessException e) { e.printStackTrace(); return null; } }}
莫得问题!
总结
1、引入相关依赖
2、修改配置文件,加入密钥配置 / 启动的时候指定密钥
以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行IT。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。