我正在开发一个需要存储静态加密的二进制信息的程序。不幸的是,我似乎找不到资源来解释哪种加密方案最适合不同的应用程序。
由于加密很复杂而且我不是专家,我决定使用一个名为Jasypt http://www.jasypt.org/它封装了 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
可用算法的列表可以通过拉入来扩展充气城堡 http://www.bouncycastle.org/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 实现,但我不知道去哪里确认这个怀疑。
哪些方案可以提供最高的安全级别,哪些方案存在明显的安全问题?
EDIT:我希望能够分发我的代码,而不需要最终用户安装无限的加密文件,因为这几乎肯定超出了不太懂技术的用户的能力。我真正想要的是在不使用无限强度管辖文件的情况下可以获得的最强加密。