druid 对数据库密码进行加密的疑惑点。

2020-10-10 11:36:23 +08:00
 different

参考资料:

https://www.w3cschool.cn/wqf_java/wqf_java-7gu82mu3.html

https://www.cnblogs.com/wuyun-blog/p/5674244.html

我看到 druid 对数据库密码进行加密大概过程就是:

把运行 jar 包对明文密码进行加密,生成了公钥、私钥、密文。

然后把公钥、密文放进配置文件中。

end.

从中我看到,可以通过公钥、密文就能解密出明文了。

有几个小疑惑:

  1. 非对称加密中,不是通过私钥、密文解出明文吗?这里怎么是公钥、密文->明文

  2. druid 的配置中把公钥、密文写到配置文件里面了,而根据这两个又能解密出明文。假设我拿到这两个字段,在我本地环境跑一下,我不也很简单解密出明文吗?这个加密后的意义在哪里?都不藏一下,这解密有啥门槛吗?

谢谢大家。

3496 次点击
所在节点    Java
19 条回复
lijialong1313
2020-10-10 11:49:37 +08:00
公钥加密,私钥解密,私钥加密,公钥解密。

我觉得是公钥密文要分开放的,这样不容易拿到。
AmosAlbert
2020-10-10 12:02:04 +08:00
公钥加密,私钥解密
different
2020-10-10 12:09:29 +08:00
@lijialong1313
@AmosAlbert
我看它加密完了,好像就不需要私钥了,这是怎么肥事?
different
2020-10-10 12:12:08 +08:00
@lijialong1313
第二个疑问能否解惑一下?#dog
different
2020-10-10 12:13:21 +08:00
@lijialong1313 不好意思,我看回答不仔细,尴尬。
chendy
2020-10-10 12:21:30 +08:00
https://github.com/alibaba/druid/blob/master/src/main/java/com/alibaba/druid/filter/config/ConfigFilter.java
注释里大概解释了一下用法
加密后的数据和秘钥放一起等于没加密,一般只留下加密后的数据,秘钥放在另外的地方
kangsheng9527
2020-10-10 12:25:39 +08:00
少用人家集成环境、框架开发,尽可能地使用原生,问问题不要局限于某种语言的方式去问。
对数据库内的密码加密方式很简单,如果自己的业务 cpu 空闲度较高的那么直接使用挑选 3 到 4 个常用不同的 hash 方式去加密即可。。。
如果密码来源于客户端还需要在客户端传送密码前加密至少一次才传输,基于“世上没有好人”,什么包括 https 都是不可信的,所以要先加密至少一次再传输。。。
xiangyuecn
2020-10-10 12:33:31 +08:00
一般是公钥加密,私钥解密。少有私钥加密,公钥解密(很多语言的开发包也没有提供这种)。

如果你不能保证私钥的安全,密文怎么存都是有被解密的风险的。

为啥不用私钥解密?因为主要是用私钥签名,公钥验证。公钥公钥:可以公开的密钥😐
yeqizhang
2020-10-10 12:42:59 +08:00
对于二,我只能理解为提高获取密码的一点复杂度,不让人肉眼看到密码……然后有些公司代码需要第三方工具来扫描漏洞,明文密码不让通过
jim9606
2020-10-10 13:22:58 +08:00
这些所谓加密都是障眼法,防止二进制包用文本扫描工具把密码扫出来而已。

看了下代码,旧版本直接在代码里硬编码了密钥,所以就不用配置公钥了,新版换成现场生成,不过其实没区别。

RSA 的加密算法和解密算法是完全一样的,所以密钥对里哪一个是是公钥取决于你公开哪一个。你可以用私钥加密公钥解密(这是签名的工作模式,druid 用的是这个模式,配置文件要填密文和公钥),也可以公钥加密私钥解密(这是一般意义加密的工作模式)
different
2020-10-10 14:16:15 +08:00
@chendy
@kangsheng9527
@xiangyuecn
@yeqizhang
@jim9606 获益良多!非常感谢,我大概清楚了。
qwerthhusn
2020-10-10 14:30:58 +08:00
感觉这东西作用不大
xiangyuecn
2020-10-10 14:31:14 +08:00
@jim9606 #10 有区别的,虽然理论上是就两个大数运算,可以用 e 或 d 来加密都可以。

但实际上不是这样的,公钥 e 一般等于 65537,用 e 来加密 和 用 d 来加密的速度那是天壤之别。

另外 私钥 d 是通过 e 作为参数来计算出来的,所有用 d 来加密数据,并不太科学的感觉。

RSA 学习了很长时间,产出两个开源库: https://github.com/xiangyuecn/RSA-csharp 还有一个 java 版的

jim9606
2020-10-10 15:17:32 +08:00
@xiangyuecn 事实标准确实不存在选 e 还是 d 的问题。

密码学库麻烦的是还要考虑各种时序和长度攻击的问题,自己写来练习还可以,实现的话还是用现成的好。

而且都 2020 年了如果不是为了兼容,都应该换用 Curve25519 或者其他 PQC 算法了。
Aresxue
2020-10-10 17:18:29 +08:00
这个主要是为了应付安全扫描,避免数据库用户密码明文裸奔,实际上用加密串半分钟就能解出来用户密码,设置这么简单是因为这种场景下加密太复杂反而会影响启动速度,真正保护数据库其实还是靠的网络层内网隔离
different
2020-10-10 18:59:24 +08:00
@Aresxue 感觉这个网络隔离也只能是防止从外网暴力破解。如果能进入应用服务器了,好像弄个加密稍微能拖延一下时间。
Aresxue
2020-10-12 10:13:53 +08:00
@different 差不多是这样子。。。但是阿里的内网只听说道哥进去过。
kanepan19
2020-10-13 15:19:22 +08:00
RSA 记住这几点
公钥加密, 私钥解密
私钥签名, 公钥验签.
different
2020-10-13 16:44:48 +08:00
@kanepan19 明白,谢谢啦

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/713590

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX