ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# :-: 数据库加密 * [基础介绍](https://www.kancloud.cn/tracy5546/dynamic-datasource/2280963#_2) * [具体使用](https://www.kancloud.cn/tracy5546/dynamic-datasource/2280963#_15) * [1\. 获得加密字符串。](https://www.kancloud.cn/tracy5546/dynamic-datasource/2280963#1__17) * [2\. 配置加密yml。](https://www.kancloud.cn/tracy5546/dynamic-datasource/2280963#2_yml_45) * [为什么不是公钥加密,私钥解密?](https://www.kancloud.cn/tracy5546/dynamic-datasource/2280963#_63) * [自定义加密?](https://www.kancloud.cn/tracy5546/dynamic-datasource/2280963#_79) # 基础介绍 在一些项目中,有对数据库关键字段加密的需求,大家熟悉的是Druid的加密方式。 在连接池集成中的Druid章节里有对应的加密方式,但是如果我不用Druid也想用加密呢? 所以作者copy了Druid的加密相关源码,嘿嘿。 本项目也支持支持`url , username, password`的加密。 使用的RAS加密,相关原理文章https://www.cnblogs.com/pcheng/p/9629621.html。 简单来说就是生成两把钥匙,私钥加密,公钥解密。 公钥可以发布出去,解密也是用的公钥。 # 具体使用 ## 1\. 获得加密字符串。 ~~~ import com.baomidou.dynamic.datasource.toolkit.CryptoUtils; public class Demo { public static void main(String[] args) throws Exception { String password = "123456"; //使用默认的publicKey ,建议还是使用下面的自定义 String encodePassword = CryptoUtils.encrypt(password); System.out.println(encodePassword); } //自定义publicKey public static void main(String[] args) throws Exception { String[] arr = CryptoUtils.genKeyPair(512); System.out.println("privateKey: " + arr[0]); System.out.println("publicKey: " + arr[1]); System.out.println("url: " + CryptoUtils.encrypt(arr[0], "jdbc:mysql://127.0.0.1:3306/order")); System.out.println("username: " + CryptoUtils.encrypt(arr[0], "root")); System.out.println("password: " + CryptoUtils.encrypt(arr[0], "123456")); } } ~~~ ![](https://img.kancloud.cn/2c/ff/2cffd7b2b2b551c51d0554bc49b9c2e8_3034x306.png) ## 2\. 配置加密yml。 ENC(xxx)` 中包裹的xxx即为使用加密方法后生成的字符串。 ~~~ spring: datasource: dynamic: public-key: #有默认值,强烈建议更换 datasource: master: url: ENC(xxxxx) username: ENC(xxxxx) password: ENC(xxxxx) driver-class-name: com.mysql.jdbc.Driver public-key: #每个数据源可以独立设置,没有就继承上面的。 ~~~ # 为什么不是公钥加密,私钥解密? 作者并不熟悉加密知识,为了兼容性copy的Druid的源码。 根据RSA的设计,大部分人会认为应该是公钥加密,私钥解密。 为什么Druid设计相反? **建议更高的安全,可以把publicKey在启动时候传进去,或者配置中心配好,不让普通开发接触到就好。** 我们查询了Druid的ISSUE和一些文章。 1. Druid作者wenshao自己的回答。 [https://github.com/alibaba/druid/issues/960](https://github.com/alibaba/druid/issues/960) ![](https://img.kancloud.cn/69/64/69646f3e965fd9beca34ddf7fa9620c3_1878x1082.png) 2. 知乎一些文章片段。 ![](https://img.kancloud.cn/85/ea/85ea1e676cb7de98bbc8b76133652b6a_866x582.png) # 自定义加密? 一些公司可能需要自定义加密,作者有了一些初步的设计,但是没有得到足够的反馈。 不知道如何定义好接口, 如你有相关需求,欢迎进群讨论。 相关代码(未发布)[https://github.com/baomidou/dynamic-datasource-spring-boot-starter/commit/c9d7837f5b1a6c500afb94da2917a3d14552c0f1](https://github.com/baomidou/dynamic-datasource-spring-boot-starter/commit/c9d7837f5b1a6c500afb94da2917a3d14552c0f1)