千家信息网

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

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍了springboot项目数据库密码怎么实现加密的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇springboot项目数据库密码怎么实现加密文章都会有所收
千家信息网最后更新 2026年10月31日springboot项目数据库密码怎么实现加密

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

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

1、pom.xml引入druid包

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

   com.alibaba   druid-spring-boot-starter   ${druid.version}  

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

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

工具类代码如下

/** * alibaba druid加解密规则: * 明文密码+私钥(privateKey)加密=加密密码 * 加密密码+公钥(publicKey)解密=明文密码 */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();        }    }    /**     * 明文加密     * @param plaintext     * @return     */    @SneakyThrows    public static String encode(String plaintext){        System.out.println("明文字符串:" + plaintext);        String ciphertext = ConfigTools.encrypt(privateKey,plaintext);        System.out.println("加密后字符串:" + ciphertext);        return ciphertext;    }    /**     * 解密     * @param ciphertext     * @return     */    @SneakyThrows    public static String decode(String ciphertext){        System.out.println("加密字符串:" + ciphertext);        String plaintext = ConfigTools.decrypt(publicKey,ciphertext);        System.out.println("解密后的字符串:" + plaintext);        return plaintext;    }

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

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/*                # 控制台管理用户名和密码                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: true                config:                    enabled: true            connection-properties: config.decrypt=true;config.decrypt.key=${spring.datasource.publickey}

方案二:使用jasypt对数据库密码加密

1、pom.xml引入jasypt包

   com.github.ulisesbocchio   jasypt-spring-boot-starter   ${jasypt.verison}  

2、利用jasypt提供的工具类对明文密码进行加密

加密工具类如下

public final class JasyptEncryptorUtils {    private static final String salt = "lybgeek";    private static BasicTextEncryptor basicTextEncryptor = new BasicTextEncryptor();    static {        basicTextEncryptor.setPassword(salt);    }    private JasyptEncryptorUtils(){}    /**     * 明文加密     * @param plaintext     * @return     */    public static String encode(String plaintext){        System.out.println("明文字符串:" + plaintext);        String ciphertext = basicTextEncryptor.encrypt(plaintext);        System.out.println("加密后字符串:" + ciphertext);        return ciphertext;    }    /**     * 解密     * @param ciphertext     * @return     */    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 "";    }}

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

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: /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: truejasypt:    encryptor:        password: lybgeek        algorithm: PBEWithMD5AndDES        iv-generator-classname: org.jasypt.iv.NoIvGenerator

方案三:自定义实现

实现原理: 利用spring后置处理器修改DataSource

1、自定义加解密工具类

/** * 利用hutool封装的加解密工具,以AES对称加密算法为例 */public 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("--------------------------------------------------------------------------------------");    }    /**     * 明文加密     * @param plaintext     * @return     */    @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;    }    /**     * 解密     * @param ciphertext     * @return     */    @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;    }    /**     * 明文加密     * @param plaintext     * @return     */    @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;    }    /**     * 解密     * @param ciphertext     * @return     */    @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;    }}

2、编写后置处理器

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;    }}

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

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

关于"springboot项目数据库密码怎么实现加密"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"springboot项目数据库密码怎么实现加密"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

加密 配置 密码 字符 字符串 数据 数据库 工具 明文 单位 时间 检测 生成 最大 最小 数量 内容 项目 密钥 文件 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 智能科技公司是互联网公司吗 互联网下的科技发展 深圳期待互联网科技 湖南洣水互联网科技有限公司扣款 科技与互联网哪个更好 互联网科技项目计划书材料类 荆州市昕露互联网络科技有限公司 辽宁互联网新科技 互联网科技大奖都有哪些公司 佛山市翊博互联网络科技有限公司 山东有哪些互联网科技公司 小米互联网科技园入驻 工业互联网科技成果转化 郑州欣桑互联网科技有限公司 互联网硬科技公司 互联网高科技行业有哪些企业 容联科技互联网电商 求路客互联网科技电话 山东蛋芒互联网科技有限公司 互联网金融金融科技 小米移动互联网科技园 互联网科技行业发展 互联网科技与金融科技 礼当家互联网科技 亿账通互联网科技 深圳期待互联网科技 如何创新互联网科技 互联网的科技体现在哪里 互联网大会出现的黑科技 现代科技的标志之一的互联网
0