different
V2EX  ›  Java

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

  •  
  •   different · Oct 10, 2020 · 5004 views
    This topic created in 2224 days ago, the information mentioned may be changed or developed.

    参考资料:

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

    谢谢大家。

    19 replies  •  2020-10-13 16:44:48 +08:00
    lijialong1313
    lijialong1313
    Oct 10, 2020
    1
    公钥加密,私钥解密,私钥加密,公钥解密。

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

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

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

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

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

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

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

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

    jim9606
    jim9606
    Oct 10, 2020
    14
    @xiangyuecn 事实标准确实不存在选 e 还是 d 的问题。

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

    而且都 2020 年了如果不是为了兼容,都应该换用 Curve25519 或者其他 PQC 算法了。
    Aresxue
    Aresxue
    Oct 10, 2020
    15
    这个主要是为了应付安全扫描,避免数据库用户密码明文裸奔,实际上用加密串半分钟就能解出来用户密码,设置这么简单是因为这种场景下加密太复杂反而会影响启动速度,真正保护数据库其实还是靠的网络层内网隔离
    different
    different
    OP
    Oct 10, 2020 via Android
    16
    @Aresxue 感觉这个网络隔离也只能是防止从外网暴力破解。如果能进入应用服务器了,好像弄个加密稍微能拖延一下时间。
    Aresxue
    Aresxue
    Oct 12, 2020
    17
    @different 差不多是这样子。。。但是阿里的内网只听说道哥进去过。
    kanepan19
    kanepan19
    Oct 13, 2020
    18
    RSA 记住这几点
    公钥加密, 私钥解密
    私钥签名, 公钥验签.
    different
    different
    OP
    Oct 13, 2020
    19
    @kanepan19 明白,谢谢啦
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1063 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 18:28 · PVG 02:28 · LAX 10:28 · JFK 13:28
    ♥ Do have faith in what you're doing.