Java加密:我应该使用哪些算法?

Mus*_*ice 6 java encryption cryptography bouncycastle jasypt

我正在研究一个需要存储静态加密的二进制信息的程序.不幸的是,我似乎无法找到一种资源来解释哪种加密方案最适合不同的应用程序.

由于加密很复杂而且我不是专家,所以我决定使用一个名为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
Run Code Online (Sandbox Code Playgroud)

在运行时,EncryptionOperationNotPossibleException如果您尝试使用由于某种原因不支持或违反Java加密规则的算法,Jasypt将抛出一个.有趣的是,如果我尝试使用每个"可用"算法来加密然后解密某些任意数据,并且只打印掉那些没有抛出异常的数据,我会得到这个精简列表:

PBEWITHMD5ANDDES
PBEWITHSHA1ANDDESEDE
PBEWITHSHA1ANDRC2_128
PBEWITHSHA1ANDRC2_40
PBEWITHSHA1ANDRC4_128
PBEWITHSHA1ANDRC4_40
Run Code Online (Sandbox Code Playgroud)

可以通过拉入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
Run Code Online (Sandbox Code Playgroud)

不幸的是,现在我不知道这些算法中哪一个最适合我的应用程序.我有一个暗示,AES是正确的方法,它看起来PBEWITHSHA256AND256BITAES-CBC-BC是具有最长密钥长度的AES实现,但我不知道去哪里确认这种怀疑.

哪些方案提供最高安全级别并且具有明显的安全问题?

编辑:我希望能够分发我的代码,而无需最终用户安装无限加密文件,因为这几乎肯定超出了不那么精通技术的用户的能力.我真正想要的是在不使用无限强度管辖权文件的情况下获得的最强加密.

Maa*_*wes 6

首先,您应该从 Oracle 安装无限制的加密文件。这样做之后,您应该拥有更少的EncryptionOperationNotPossibleExceptions,并且应该可以使用更高的安全级别。

此外,对于可能的最高级别加密,我根本不会使用 JaSypt,因为它似乎不提供任何完整性检查或 ciphertext 身份验证。只是为了保密,这似乎无关紧要。但在实践中,您需要根据您的威胁模型进行检查。

如果您决定使用 JaSypt(我个人不喜欢),您可能应该选择PBEWITHHMACSHA512ANDAES_256最高级别的可能性。确保您了解 PBKDF2 和工作因素(迭代计数,例如setKeyObtentionIterations.

你不需要充气城堡。AES 被认为是安全的;Bouncy Castle 所做的所有事情——例如你使用 JaSypt 的例子——就是添加晦涩的密码。在上面的列表中,除 AES 之外的所有内容都不如 AES 安全。