最近经常在网上看到有人说巨硬的 CNG(Cryptography Next Generation 即下一代加密技术) 只提供 RSA 公钥加密私钥解密,没有提供 RSA 私钥加密公钥解密,他们要自己封装一个。。
我想说,你 TM 真的有思考过这个做法安全吗?这个做法有意义吗?
有点 Brain 的人想想就知道,把一个公开的,任何人都可以拿到的公钥作为解密密钥,那和不加密有什么区别?这样的做法甚至有暴露私钥的风险!
那来说说正确的做法:
(1) 如果只是需要验证客户端收到的内容是服务器返回的,没有被篡改,那么可以使用 RSA 签名算法,私钥签名,公钥验证 (这个 CNG 是有提供的,其他算法库也基本都有)。
(2) 如果确实需要加密服务器返回的内容,那么可以学习 SSL 的做法:
首先客户端生成一个对称加密的密钥,然后 RSA 公钥加密(数据包 + 对称密钥) 发送给服务器。
服务器收到内容后使用私钥解密出数据包和对称密钥,然后进行业务逻辑处理,再将结果使用对称密钥进行对称加密,然后返回给客户端。
最后客户端将收到的内容后使用对称密钥解密即可。
这个做法是比较安全的,私钥和对称密钥都没有暴露的风险。
好奇翻了一下,居然发现大量的 RSA 私钥加密公钥解密的开源库。。。星星还不少。。。
你们看看那些正儿八经的加密库,比如 OpenSSL, BC 等,它们也没有提供这种做法啊,难道他们就没想到,或者他们会因为任性不想做而不做?不可能吧。
再说巨硬这个大厂子了,总有他不做的道理吧。
我是真的希望大佬们不要再做 RSA 私钥加密公钥解密这种事了,已经做了也尽量改掉把;改完我们还是最好的朋友。
感谢阅读!