最近經常在網上看到有人說巨硬的 CNG(Cryptography Next Generation 即下一代加密技術) 只提供 RSA 公鑰加密私鑰解密,沒有提供 RSA 私鑰加密公鑰解密,他們要自己封裝一個。。
我想說,你真的有思考過這個做法安全嗎?這個做法有意義嗎?
想想就知道,把一個公開的,任何人都可以拿到的公鑰作為解密密鑰,那和不加密有什么區別?這樣的做法甚至有暴露私鑰的風險!
那來說說正確的做法:
(1) 如果只是需要驗證客戶端收到的內容是服務器返回的,沒有被篡改,那么可以使用 RSA 簽名算法,私鑰簽名,公鑰驗證 (這個 CNG 是有提供的,其他算法庫也基本都有)。
(2) 如果確實需要加密服務器返回的內容,那么可以學習 SSL 的做法:
首先客戶端生成一個對稱加密的密鑰,然后 RSA 公鑰加密(數據包 + 對稱密鑰) 發送給服務器。
服務器收到內容后使用私鑰解密出數據包和對稱密鑰,然后進行業務邏輯處理,再將結果使用對稱密鑰進行對稱加密,然后返回給客戶端。
最后客戶端將收到的內容后使用對稱密鑰解密即可。
這個做法是比較安全的,私鑰和對稱密鑰都沒有暴露的風險。
我好奇翻了一下,居然發現大量的 RSA 私鑰加密公鑰解密的開源庫。。。星星還不少。。。
你們看看那些正兒八經的加密庫,比如 OpenSSL, BC 等,它們也沒有提供這種做法啊,難道他們就沒想到,或者他們會因為任性不想做而不做?不可能吧。
再說巨硬這個大廠子了,總有他不做的道理吧。
我是真的希望大佬們不要再做 RSA 私鑰加密公鑰解密這種事了,已經做了也盡量改掉把;改完我們還是好朋友。
感謝閱讀!