我正在研究需要存儲在休息時加密的二進制信息的程序。不幸的是,我似乎無法找到解釋哪種加密方案最適合不同應用的資源。Java加密:我應該使用什麼算法?
由於加密比較複雜,而且我不是專家,所以我決定使用一個叫做Jasypt的庫來包裝Java的內置加密函數。爲了弄清楚我可以使用哪些算法,我寫了一些單元測試。
第一個測試調用Jasypt的AlgorithmRegistry.getAllPBEAlgorithms()
功能,並列出了所有可用的加密算法:
PBEWITHHMACSHA1ANDAES_128
PBEWITHHMACSHA1ANDAES_256
PBEWITHHMACSHA224ANDAES_128
PBEWITHHMACSHA224ANDAES_256
PBEWITHHMACSHA256ANDAES_128
PBEWITHHMACSHA256ANDAES_256
PBEWITHHMACSHA384ANDAES_128
PBEWITHHMACSHA384ANDAES_256
PBEWITHHMACSHA512ANDAES_128
PBEWITHHMACSHA512ANDAES_256
PBEWITHMD5ANDDES
PBEWITHMD5ANDTRIPLEDES
PBEWITHSHA1ANDDESEDE
PBEWITHSHA1ANDRC2_128
PBEWITHSHA1ANDRC2_40
PBEWITHSHA1ANDRC4_128
PBEWITHSHA1ANDRC4_40
在運行時,如果您嘗試使用,由於某種原因,不支持的算法,Jasypt將拋出一個EncryptionOperationNotPossibleException
或違反了Java的加密規則。有趣的是,如果我嘗試使用每個「可用」的算法來加密和解密,然後一些任意的數據,並且只打印出不拋出異常的,我得到這個瘦身清單:
PBEWITHMD5ANDDES
PBEWITHSHA1ANDDESEDE
PBEWITHSHA1ANDRC2_128
PBEWITHSHA1ANDRC2_40
PBEWITHSHA1ANDRC4_128
PBEWITHSHA1ANDRC4_40
通過拉入BouncyCastle JCE並通過執行Security.addProvider(new BouncyCastleProvider())
進行註冊,可以擴展可用算法的列表。如果我這樣做後重復前面的測試中,我得到的算法,一個更大的列表中進行選擇:
PBEWITHMD2ANDDES
PBEWITHMD5AND128BITAES-CBC-OPENSSL
PBEWITHMD5AND192BITAES-CBC-OPENSSL
PBEWITHMD5AND256BITAES-CBC-OPENSSL
PBEWITHMD5ANDDES
PBEWITHMD5ANDRC2
PBEWITHSHA1ANDDES
PBEWITHSHA1ANDDESEDE
PBEWITHSHA1ANDRC2
PBEWITHSHA1ANDRC2_128
PBEWITHSHA1ANDRC2_40
PBEWITHSHA1ANDRC4_128
PBEWITHSHA1ANDRC4_40
PBEWITHSHA256AND128BITAES-CBC-BC
PBEWITHSHA256AND192BITAES-CBC-BC
PBEWITHSHA256AND256BITAES-CBC-BC
PBEWITHSHAAND128BITAES-CBC-BC
PBEWITHSHAAND128BITRC2-CBC
PBEWITHSHAAND128BITRC4
PBEWITHSHAAND192BITAES-CBC-BC
PBEWITHSHAAND2-KEYTRIPLEDES-CBC
PBEWITHSHAAND256BITAES-CBC-BC
PBEWITHSHAAND3-KEYTRIPLEDES-CBC
PBEWITHSHAAND40BITRC2-CBC
PBEWITHSHAAND40BITRC4
PBEWITHSHAANDIDEA-CBC
PBEWITHSHAANDTWOFISH-CBC
不幸的是,現在我不知道這些很多算法這是最適合我的申請。我有一個暗示,AES是正確的路要走,看起來像PBEWITHSHA256AND256BITAES-CBC-BC
是密鑰長度最長的AES實現,但我不知道該去哪裏去確認這個懷疑。
這些方案中的哪一個可以提供最高的安全級別並且存在明顯的安全問題?
編輯:我希望能夠無需最終用戶安裝無限的加密文件分發給我的代碼,因爲這幾乎肯定會超越不那麼精通技術的用戶的能力。我真正想要的是我可以在不使用無限強度管轄區文件的情況下獲得最強大的加密。
不要。使用包裝庫來做出所有正確的決定。閱讀http://blog.slaks.net/2015-11-18/common-crypto-pitfalls/ – SLaks
我改變了這個問題來直接解釋哪個方案提供了「最高安全級別」。要求非現場解釋/指示是主題,要求「最好」是主觀的。這兩個都是解決問題的理由。 –
你不需要一個庫;使用java API不難。我的例子 - https://gist.github.com/zhong-j-yu/9d23c850e580d60ddd46 – ZhongYu