广告
返回顶部
首页 > 资讯 > 精选 >springboot项目数据库密码怎么加密
  • 671
分享到

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

2023-06-20 15:06:56 671人浏览 安东尼
摘要

这篇文章主要介绍“SpringBoot项目数据库密码怎么加密”,在日常操作中,相信很多人在springboot项目数据库密码怎么加密问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”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项目数据库密码怎么加密”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: springboot项目数据库密码怎么加密

本文链接: https://www.lsjlt.com/news/297531.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • springboot项目数据库密码怎么加密
    这篇文章主要介绍“springboot项目数据库密码怎么加密”,在日常操作中,相信很多人在springboot项目数据库密码怎么加密问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”springboot项目数据库...
    99+
    2023-06-20
  • springboot项目数据库密码怎么实现加密
    这篇文章主要介绍了springboot项目数据库密码怎么实现加密的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇springboot项目数据库密码怎么实现加密文章都会有所收获,下面我们一起来看看吧。方案一、使用d...
    99+
    2023-06-08
  • springboot项目数据库密码如何加密
    前言 在我们日常开发中,我们可能很随意把数据库密码直接明文暴露在配置文件中,在开发环境可以这么做,但是在生产环境,是相当不建议这么做,毕竟安全无小事,谁也不知道哪天密码就莫名其妙泄...
    99+
    2022-11-12
  • SpringBoot项目中如何利用application.yml文件配置数据库密码加密
    这篇文章主要讲解了“SpringBoot项目中如何利用application.yml文件配置数据库密码加密”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot项目中如何利用ap...
    99+
    2023-06-08
  • 使用springboot怎么对数据库密码进行加密
    使用springboot怎么对数据库密码进行加密?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1.导入依赖<dependency> &nb...
    99+
    2023-06-14
  • springboot数据库密码加密的配置方法
    前言 由于系统安全的考虑,配置文件中不能出现明文密码的问题,本文就给大家详细介绍下springboot配置数据库密码加密的方法,下面话不多说了,来一起看看详细的介绍吧 1.导入依赖 ...
    99+
    2022-11-12
  • 数据库内密码需要怎么加密
    数据库中对密码进行加密的方法有以下几种BASE64加密方法如下:String encode = (new BASE64Encoder()).encode(s.getBytes());System.out.println(encode);by...
    99+
    2022-10-16
  • springboot 项目使用jasypt加密数据源的方法
    引入maven 坐标 <dependency> <groupId>com.github.ulisesbocchio</groupI...
    99+
    2022-11-12
  • edb数据库怎么加密码
    使用易语言对edb数据库设置密码的方法首先,打开并进入易语言编程软件;在软件界面中点击上方的“数据库”按钮,并在下拉中选择“结构编辑器”选项;进入到结构编译器页面后,在界面中点击“设置密码”按钮;在弹出的文件选择对话框中,选择需要设置密码的...
    99+
    2022-10-05
  • 怎么给mysql数据库中密码属性加密
    mysql数据库给密码属性加密的方法有以下几种使用password()函数加密select password('root');sy old_password()函数加密select old_...
    99+
    2022-10-12
  • druid数据源密码怎么加密
    对druid数据源密码进行加密的方法首先,在druid中新建一个数据源配置类;@Configurationpublic class DruidConfig {@Value("${spring.datasource.publicKey}")p...
    99+
    2022-10-06
  • 关于Springboot数据库配置文件明文密码加密解密的问题
    有时候因为安全问题,需要把配置文件的中数据库用户名密码由明文改成密文,大多数其实是为了应付甲方而已。 1.pom.xml引入依赖 <dependency> <...
    99+
    2022-11-13
  • 数据库密码通常采用什么加密
    常用于对数据库进行密码加密的加密算法有以下几种MD5加密算法MD5为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护,MD5是以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的...
    99+
    2022-10-04
  • 如何在PHP项目中实现数据加密和解密?
    如何在PHP项目中实现数据加密和解密?随着互联网的发展,数据安全成为了一个非常重要的问题。在PHP项目中,我们经常需要处理一些敏感的数据,如用户密码、用户信息等。为了保护这些数据不被恶意获取,我们需要对其进行加密和解密操作。本文将介绍如何在...
    99+
    2023-11-02
    数据加密:encrypt 数据解密:decrypt PHP项目:PHP project
  • java项目中如何实现数据的加密与解密
    java项目中如何实现数据的加密与解密?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。  这是一个关于密钥查询的jsp文件,接受上级文件的数据并加密处理,放入Map集合...
    99+
    2023-05-31
    java 加密 解密
  • Vue项目怎么实现rsa加密
    这篇“Vue项目怎么实现rsa加密”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue项目怎么实现rsa加密”文章吧。安装j...
    99+
    2023-07-02
  • springboot如何给数据库地址加密
    使用pringboot对数据库地址进行加密的方法首先,需要在springboot项目中导入依赖;com.github.ulisesbocchiojasypt-spring-boot-starter2.0.0依赖导入好后,在springboo...
    99+
    2022-10-07
  • 如何查看Navicat加密的数据库密码
    目录查看Navicat加密的数据库密码1、打开运行窗口,输入regedit,点击确认按钮,打开注册表编辑器2、在注册表中找到Navicat加密后的密码3、打开php在线运行工具,粘贴解密代码4. 修改倒数第三行Navic...
    99+
    2023-04-20
    Navicat查看数据库密码 Navicat数据库密码加密 Navicat密码加密
  • edb数据库如何加密码
    给edb数据库设置密码的方法首先,打开并进入易语言编程软件;在软件界面中点击上方的“数据库”按钮,并在下拉中选择“结构编辑器”选项;进入结构编译器页面后,在界面中点击“置密码”按钮;在弹出的文件选择对话框中,选择需要设置密码的edb数据库,...
    99+
    2022-10-22
  • 数据库密码信息加密方式有哪些
    数据库中常见的密码信息加密方式有以下几种MD5加密MD5为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护,MD5是以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个...
    99+
    2022-10-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作