
参考资料:
https://www.w3cschool.cn/wqf_java/wqf_java-7gu82mu3.html
https://www.cnlogs.com/wuyun-blog/p/5674244.html
我看到 druid 对数据库密码进行加密大概过程就是:
把运行 jar 包对明文密码进行加密,生成了公钥、私钥、密文。
然后把公钥、密文放进配置文件中。
end.
从中我看到,可以通过公钥、密文就能解密出明文了。
有几个小疑惑:
非对称加密中,不是通过私钥、密文解出明文吗?这里怎么是公钥、密文->明文
druid 的配置中把公钥、密文写到配置文件里面了,而根据这两个又能解密出明文。假设我拿到这两个字段,在我本地环境跑一下,我不也很简单解密出明文吗?这个加密后的意义在哪里?都不藏一下,这解密有啥门槛吗?
谢谢大家。
1 lijialong1313 2020-10-10 11:49:37 +08:00 公钥加密,私钥解密,私钥加密,公钥解密。 我觉得是公钥密文要分开放的,这样不容易拿到。 |
2 AmosAlbert 2020-10-10 12:02:04 +08:00 公钥加密,私钥解密 |
3 different OP |
4 different OP @lijialong1313 第二个疑问能否解惑一下?#dog |
5 different OP @lijialong1313 不好意思,我看回答不仔细,尴尬。 |
6 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 注释里大概解释了一下用法 加密后的数据和秘钥放一起等于没加密,一般只留下加密后的数据,秘钥放在另外的地方 |
7 kangsheng9527 2020-10-10 12:25:39 +08:00 少用人家集成环境、框架开发,尽可能地使用原生,问问题不要局限于某种语言的方式去问。 对数据库内的密码加密方式很简单,如果自己的业务 cpu 空闲度较高的那么直接使用挑选 3 到 4 个常用不同的 hash 方式去加密即可。。。 如果密码来源于客户端还需要在客户端传送密码前加密至少一次才传输,基于“世上没有好人”,什么包括 https 都是不可信的,所以要先加密至少一次再传输。。。 |
8 xiangyuecn 2020-10-10 12:33:31 +08:00 一般是公钥加密,私钥解密。少有私钥加密,公钥解密(很多语言的开发包也没有提供这种)。 如果你不能保证私钥的安全,密文怎么存都是有被解密的风险的。 为啥不用私钥解密?因为主要是用私钥签名,公钥验证。公钥公钥:可以公开的密钥 |
9 yeqizhang 2020-10-10 12:42:59 +08:00 via Android 对于二,我只能理解为提高获取密码的一点复杂度,不让人肉眼看到密码……然后有些公司代码需要第三方工具来扫描漏洞,明文密码不让通过 |
10 jim9606 2020-10-10 13:22:58 +08:00 这些所谓加密都是障眼法,防止二进制包用文本扫描工具把密码扫出来而已。 看了下代码,旧版本直接在代码里硬编码了密钥,所以就不用配置公钥了,新版换成现场生成,不过其实没区别。 RSA 的加密算法和解密算法是完全一样的,所以密钥对里哪一个是是公钥取决于你公开哪一个。你可以用私钥加密公钥解密(这是签名的工作模式,druid 用的是这个模式,配置文件要填密文和公钥),也可以公钥加密私钥解密(这是一般意义加密的工作模式) |
11 different OP |
12 qwerthhusn 2020-10-10 14:30:58 +08:00 感觉这东西作用不大 |
13 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 版的 |
14 jim9606 2020-10-10 15:17:32 +08:00 @xiangyuecn 事实标准确实不存在选 e 还是 d 的问题。 密码学库麻烦的是还要考虑各种时序和长度攻击的问题,自己写来练习还可以,实现的话还是用现成的好。 而且都 2020 年了如果不是为了兼容,都应该换用 Curve25519 或者其他 PQC 算法了。 |
15 Aresxue 2020-10-10 17:18:29 +08:00 这个主要是为了应付安全扫描,避免数据库用户密码明文裸奔,实际上用加密串半分钟就能解出来用户密码,设置这么简单是因为这种场景下加密太复杂反而会影响启动速度,真正保护数据库其实还是靠的网络层内网隔离 |
16 different OP @Aresxue 感觉这个网络隔离也只能是防止从外网暴力破解。如果能进入应用服务器了,好像弄个加密稍微能拖延一下时间。 |
18 kanepan19 2020-10-13 15:19:22 +08:00 RSA 记住这几点 公钥加密, 私钥解密 私钥签名, 公钥验签. |