我的编程空间,编程开发者的网络收藏夹
学习永远不晚

springboot项目数据库密码怎么加密

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

springboot项目数据库密码怎么加密

这篇文章主要介绍“springboot项目数据库密码怎么加密”,在日常操作中,相信很多人在springboot项目数据库密码怎么加密问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”springboot项目数据库密码怎么加密”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

前言

在我们日常开发中,我们可能很随意把数据库密码直接明文暴露在配置文件中,在开发环境可以这么做,但是在生产环境,是相当不建议这么做,毕竟安全无小事,谁也不知道哪天密码就莫名其妙泄露了。今天就来聊聊在springboot项目中如何对数据库密码进行加密

正文

方案一、使用druid数据库连接池对数据库密码加密

pom.xml引入druid包

为了方便其他的操作,这边直接引入druid的starter

<dependency>   <groupId>com.alibaba</groupId>   <artifactId>druid-spring-boot-starter</artifactId>   <version>${druid.version}</version>  </dependency>

利用com.alibaba.druid.filter.config.ConfigTools生成公私钥

ps: 生成的方式有两种,一种利用命令行生成,一种直接写个工具类生成。本文示例直接采用工具类生成

工具类代码如下

public final class DruidEncryptorUtils {    private static String privateKey;    private static String publicKey;    static {        try {            String[] keyPair = ConfigTools.genKeyPair(512);            privateKey = keyPair[0];            System.out.println(String.format("privateKey-->%s",privateKey));            publicKey = keyPair[1];            System.out.println(String.format("publicKey-->%s",publicKey));        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        } catch (NoSuchProviderException e) {            e.printStackTrace();        }    }        @SneakyThrows    public static String encode(String plaintext){        System.out.println("明文字符串:" + plaintext);        String ciphertext = ConfigTools.encrypt(privateKey,plaintext);        System.out.println("加密后字符串:" + ciphertext);        return ciphertext;    }        @SneakyThrows    public static String decode(String ciphertext){        System.out.println("加密字符串:" + ciphertext);        String plaintext = ConfigTools.decrypt(publicKey,ciphertext);        System.out.println("解密后的字符串:" + plaintext);        return plaintext;    }

修改数据库的配置文件内容信息

a 、 修改密码
把密码替换成用DruidEncryptorUtils这个工具类生成的密码

 password: ${DATASOURCE_PWD:HB5FmUeAI1U81YJrT/T6awImFg1/Az5o8imy765WkVJouOubC2H80jqmZrr8L9zWKuzS/8aGzuQ4YySAkhywnA==}

b、 filter开启config

 filter:                config:                    enabled: true

c、配置connectionProperties属性

 connection-properties: config.decrypt=true;config.decrypt.key=${spring.datasource.publickey}

ps: spring.datasource.publickey为工具类生成的公钥

附录: 完整数据库配置

spring:    datasource:        type: com.alibaba.druid.pool.DruidDataSource        driverClassName: com.mysql.cj.jdbc.Driver        url: ${DATASOURCE_URL:jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai}        username: ${DATASOURCE_USERNAME:root}        password: ${DATASOURCE_PWD:HB5FmUeAI1U81YJrT/T6awImFg1/Az5o8imy765WkVJouOubC2H80jqmZrr8L9zWKuzS/8aGzuQ4YySAkhywnA==}        publickey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIvP9xF4RCM4oFiu47NZY15iqNOAB9K2Ml9fiTLa05CWaXK7uFwBImR7xltZM1frl6ahWAXJB6a/FSjtJkTZUJECAwEAAQ==        druid:            # 初始连接数            initialSize: 5            # 最小连接池数量            minIdle: 10            # 最大连接池数量            maxActive: 20            # 配置获取连接等待超时的时间            maxWait: 60000            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒            timeBetweenEvictionRunsMillis: 60000            # 配置一个连接在池中最小生存的时间,单位是毫秒            minEvictableIdleTimeMillis: 300000            # 配置一个连接在池中最大生存的时间,单位是毫秒            maxEvictableIdleTimeMillis: 900000            # 配置检测连接是否有效            validationQuery: SELECT 1 FROM DUAL            testWhileIdle: true            testOnBorrow: false            testOnReturn: false            webStatFilter:                enabled: true            statViewServlet:                enabled: true                # 设置白名单,不填则允许所有访问                allow:                url-pattern: /druid    public static String encode(String plaintext){        System.out.println("明文字符串:" + plaintext);        String ciphertext = basicTextEncryptor.encrypt(plaintext);        System.out.println("加密后字符串:" + ciphertext);        return ciphertext;    }        public static String decode(String ciphertext){        System.out.println("加密字符串:" + ciphertext);        ciphertext = "ENC(" + ciphertext + ")";        if (PropertyValueEncryptionUtils.isEncryptedValue(ciphertext)){            String plaintext = PropertyValueEncryptionUtils.decrypt(ciphertext,basicTextEncryptor);            System.out.println("解密后的字符串:" + plaintext);            return plaintext;        }        System.out.println("解密失败");        return "";    }}

修改数据库的配置文件内容信息

a、 用ENC包裹用JasyptEncryptorUtils 生成的加密串

password: ${DATASOURCE_PWD:ENC(P8m43qmzqN4c07DCTPey4Q==)}

b、 配置密钥和指定加解密算法

jasypt:    encryptor:        password: lybgeek        algorithm: PBEWithMD5AndDES        iv-generator-classname: org.jasypt.iv.NoIvGenerator

因为我工具类使用的是加解密的工具类是BasicTextEncryptor,其对应配置加解密就是PBEWithMD5AndDES和org.jasypt.iv.NoIvGenerator

ps: 在生产环境中,建议使用如下方式配置密钥,避免密钥泄露

java -jar -Djasypt.encryptor.password=lybgeek

附录: 完整数据库配置

spring:    datasource:        type: com.alibaba.druid.pool.DruidDataSource        driverClassName: com.mysql.cj.jdbc.Driver        url: ${DATASOURCE_URL:ENC(kT/gwazwzaFNEp7OCbsgCQN7PHRohaTKJNdGVgLsW2cH67zqBVEq7mN0BTIXAeF4/Fvv4l7myLFx0y6ap4umod7C2VWgyRU5UQtKmdwzQN3hxVxktIkrFPn9DM6+YahM0xP+ppO9HaWqA2ral0ejBCvmor3WScJNHCAhI9kHjYc=)}        username: ${DATASOURCE_USERNAME:ENC(rEQLlqM5nphqnsuPj3MlJw==)}        password: ${DATASOURCE_PWD:ENC(P8m43qmzqN4c07DCTPey4Q==)}        druid:            # 初始连接数            initialSize: 5            # 最小连接池数量            minIdle: 10            # 最大连接池数量            maxActive: 20            # 配置获取连接等待超时的时间            maxWait: 60000            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒            timeBetweenEvictionRunsMillis: 60000            # 配置一个连接在池中最小生存的时间,单位是毫秒            minEvictableIdleTimeMillis: 300000            # 配置一个连接在池中最大生存的时间,单位是毫秒            maxEvictableIdleTimeMillis: 900000            # 配置检测连接是否有效            validationQuery: SELECT 1 FROM DUAL            testWhileIdle: true            testOnBorrow: false            testOnReturn: false            webStatFilter:                enabled: true            statViewServlet:                enabled: true                # 设置白名单,不填则允许所有访问                allow:                url-pattern: /druidpublic final class EncryptorUtils {    private static String secretKey;    static {        secretKey = Hex.encodeHexString(SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded());        System.out.println("secretKey-->" + secretKey);        System.out.println("--------------------------------------------------------------------------------------");    }        @SneakyThrows    public static String encode(String plaintext){        System.out.println("明文字符串:" + plaintext);        byte[] key = Hex.decodeHex(secretKey.toCharArray());        String ciphertext =  SecureUtil.aes(key).encryptHex(plaintext);        System.out.println("加密后字符串:" + ciphertext);        return ciphertext;    }        @SneakyThrows    public static String decode(String ciphertext){        System.out.println("加密字符串:" + ciphertext);        byte[] key = Hex.decodeHex(secretKey.toCharArray());        String plaintext = SecureUtil.aes(key).decryptStr(ciphertext);        System.out.println("解密后的字符串:" + plaintext);        return plaintext;    }        @SneakyThrows    public static String encode(String secretKey,String plaintext){        System.out.println("明文字符串:" + plaintext);        byte[] key = Hex.decodeHex(secretKey.toCharArray());        String ciphertext =  SecureUtil.aes(key).encryptHex(plaintext);        System.out.println("加密后字符串:" + ciphertext);        return ciphertext;    }        @SneakyThrows    public static String decode(String secretKey,String ciphertext){        System.out.println("加密字符串:" + ciphertext);        byte[] key = Hex.decodeHex(secretKey.toCharArray());        String plaintext = SecureUtil.aes(key).decryptStr(ciphertext);        System.out.println("解密后的字符串:" + plaintext);        return plaintext;    }}

编写后置处理器

public class DruidDataSourceEncyptBeanPostProcessor implements BeanPostProcessor {    private CustomEncryptProperties customEncryptProperties;    private DataSourceProperties dataSourceProperties;    public DruidDataSourceEncyptBeanPostProcessor(CustomEncryptProperties customEncryptProperties, DataSourceProperties dataSourceProperties) {        this.customEncryptProperties = customEncryptProperties;        this.dataSourceProperties = dataSourceProperties;    }    @Override    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {        if(bean instanceof DruidDataSource){            if(customEncryptProperties.isEnabled()){                DruidDataSource druidDataSource = (DruidDataSource)bean;                System.out.println("--------------------------------------------------------------------------------------");                String username = dataSourceProperties.getUsername();                druidDataSource.setUsername(EncryptorUtils.decode(customEncryptProperties.getSecretKey(),username));                System.out.println("--------------------------------------------------------------------------------------");                String password = dataSourceProperties.getPassword();                druidDataSource.setPassword(EncryptorUtils.decode(customEncryptProperties.getSecretKey(),password));                System.out.println("--------------------------------------------------------------------------------------");                String url = dataSourceProperties.getUrl();                druidDataSource.setUrl(EncryptorUtils.decode(customEncryptProperties.getSecretKey(),url));                System.out.println("--------------------------------------------------------------------------------------");            }        }        return bean;    }}

修改数据库的配置文件内容信息

a 、 修改密码
把密码替换成用自定义加密工具类生成的加密密码

  password: ${DATASOURCE_PWD:fb31cdd78a5fa2c43f530b849f1135e7}

b 、 指定密钥和开启加密功能

custom:    encrypt:        enabled: true        secret-key: 2f8ba810011e0973728afa3f28a0ecb6

ps: 同理secret-key最好也不要直接暴露在配置文件中,可以用-Dcustom.encrypt.secret-key指定
附录: 完整数据库配置

spring:    datasource:        type: com.alibaba.druid.pool.DruidDataSource        driverClassName: com.mysql.cj.jdbc.Driver        url: ${DATASOURCE_URL:dcb268cf3a2626381d2bc5c96f94fb3d7f99352e0e392362cb818a321b0ca61f3a8dad3aeb084242b745c61a1d3dc244ed1484bf745c858c44560dde10e60e90ac65f77ce2926676df7af6b35aefd2bb984ff9a868f1f9052ee9cae5572fa015b66a602f32df39fb1bbc36e04cc0f148e4d610a3e5d54f2eb7c57e4729c9d7b4}        username: ${DATASOURCE_USERNAME:61db3bf3c6d3fe3ce87549c1af1e9061}        password: ${DATASOURCE_PWD:fb31cdd78a5fa2c43f530b849f1135e7}        druid:            # 初始连接数            initialSize: 5            # 最小连接池数量            minIdle: 10            # 最大连接池数量            maxActive: 20            # 配置获取连接等待超时的时间            maxWait: 60000            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒            timeBetweenEvictionRunsMillis: 60000            # 配置一个连接在池中最小生存的时间,单位是毫秒            minEvictableIdleTimeMillis: 300000            # 配置一个连接在池中最大生存的时间,单位是毫秒            maxEvictableIdleTimeMillis: 900000            # 配置检测连接是否有效            validationQuery: SELECT 1 FROM DUAL            testWhileIdle: true            testOnBorrow: false            testOnReturn: false            webStatFilter:                enabled: true            statViewServlet:                enabled: true                # 设置白名单,不填则允许所有访问                allow:                url-pattern: /druid/*                # 控制台管理用户名和密码                login-username:                login-password:            filter:                stat:                    enabled: true                    # 慢SQL记录                    log-slow-sql: true                    slow-sql-millis: 1000                    merge-sql: true                wall:                    config:                        multi-statement-allow: truecustom:    encrypt:        enabled: true        secret-key: 2f8ba810011e0973728afa3f28a0ecb6

总结

上面三种方案,个人比较推荐用jasypt这种方案,因为它不仅可以对密码加密,也可以对其他内容加密。而druid只能对数据库密码加密。至于自定义的方案,属于练手,毕竟开源已经有的东西,就不要再自己造轮子了。
最后还有一个注意点就是jasypt如果是高于2版本,且以低于3.0.3,会导致配置中心,比如apollo或者nacos的动态刷新配置失效(最新版的3.0.3官方说已经修复了这个问题)。

springboot项目数据库密码怎么加密

如果有使用配置中心的话,jasypt推荐使用3版本以下,或者使用3.0.3版本

到此,关于“springboot项目数据库密码怎么加密”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

springboot项目数据库密码怎么加密

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

springboot项目数据库密码怎么加密

这篇文章主要介绍“springboot项目数据库密码怎么加密”,在日常操作中,相信很多人在springboot项目数据库密码怎么加密问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”springboot项目数据库
2023-06-20

springboot项目数据库密码怎么实现加密

这篇文章主要介绍了springboot项目数据库密码怎么实现加密的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇springboot项目数据库密码怎么实现加密文章都会有所收获,下面我们一起来看看吧。方案一、使用d
2023-06-08

SpringBoot项目中如何利用application.yml文件配置数据库密码加密

这篇文章主要讲解了“SpringBoot项目中如何利用application.yml文件配置数据库密码加密”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot项目中如何利用ap
2023-06-08

使用springboot怎么对数据库密码进行加密

使用springboot怎么对数据库密码进行加密?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1.导入依赖
2023-06-14

SpringBoot使用Jasypt对配置文件和数据库密码加密

本指南详细阐述了如何使用Jasypt库在SpringBoot中加密配置文件和数据库密码。Jasypt提供多种加密算法和模式,通过@EnableEncryptableProperties注解轻松集成。使用@EncryptedValue注解可加密配置文件中的敏感值,而数据库密码可以通过Spring配置设置加密。文章强调了配置Jasypt的重要性,并提供了安全性注意事项,例如保密加密密钥和定期轮换。通过实施加密,可以保护敏感信息并提高应用程序的安全性。
SpringBoot使用Jasypt对配置文件和数据库密码加密
2024-04-02

如何查看Navicat加密的数据库密码

目录查看Navicat加密的数据库密码1、打开运行窗口,输入regedit,点击确认按钮,打开注册表编辑器2、在注册表中找到Navicat加密后的密码3、打开php在线运行工具,粘贴解密代码4. 修改倒数第三行NavicatPassword
2023-04-20

navicat怎么改数据库密码

navicat 修改数据库密码步骤:1. 连接数据库;2. 打开连接属性窗口;3. 输入旧密码及新密码;4. 测试新密码;5. 保存更改。Navicat中修改数据库密码Navicat是一种数据库管理工具,它允许用户轻松管理和修改数据库连接
navicat怎么改数据库密码
2024-04-23

如何在PHP项目中实现数据加密和解密?

如何在PHP项目中实现数据加密和解密?随着互联网的发展,数据安全成为了一个非常重要的问题。在PHP项目中,我们经常需要处理一些敏感的数据,如用户密码、用户信息等。为了保护这些数据不被恶意获取,我们需要对其进行加密和解密操作。本文将介绍如何在
如何在PHP项目中实现数据加密和解密?
2023-11-02

mysql数据库怎么改密码

如何更改 mysql 数据库密码?登录 mysql:mysql -u [用户名] -p输入当前密码更改密码:alter user '[用户名]'@'%' identified by '[新密码]';刷新权限:flush privileges
mysql数据库怎么改密码
2024-05-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录