Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该使用什么Java加密算法?_Java_Encryption_Cryptography_Bouncycastle_Jasypt - Fatal编程技术网

我应该使用什么Java加密算法?

我应该使用什么Java加密算法?,java,encryption,cryptography,bouncycastle,jasypt,Java,Encryption,Cryptography,Bouncycastle,Jasypt,我正在开发一个程序,需要存储静态加密的二进制信息。不幸的是,我似乎找不到一个资源来解释哪些加密方案最适合不同的应用程序 由于加密很复杂,而且我不是专家,所以我决定使用一个名为的库来包装Java的内置加密函数。为了弄清楚我可以使用哪些算法,我编写了一些单元测试 第一个测试调用Jasypt的AlgorithmRegistry.getAllPBEAlgorithms()函数并列出所有可用的加密算法: PBEWITHHMACSHA1ANDAES_128 PBEWITHHMACSHA1ANDAES_256

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

由于加密很复杂,而且我不是专家,所以我决定使用一个名为的库来包装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
在运行时,如果您试图使用因某种原因不受支持或违反Java加密规则的算法,Jasypt将抛出一个
EncryptionOperationNotPossibleeException
。有趣的是,如果我尝试使用每一种“可用”算法对一些任意数据进行加密和解密,然后只打印出没有引发该异常的数据,我会得到以下精简列表:

PBEWITHMD5ANDDES
PBEWITHSHA1ANDDESEDE
PBEWITHSHA1ANDRC2_128
PBEWITHSHA1ANDRC2_40
PBEWITHSHA1ANDRC4_128
PBEWITHSHA1ANDRC4_40
通过拉入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是正确的方法,看起来
pbewithsha256和256biates-CBC-BC
是密钥长度最长的AES实现,但我不知道去哪里确认这种怀疑

这些方案中哪一个提供最高的安全级别,哪一个存在明显的安全问题


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

首先,您应该从Oracle安装无限加密文件。执行此操作后,您应该拥有更少的
加密操作不可能例外
s,并且应该有更高的安全级别可用

此外,对于可能的最高级别加密,我根本不会使用JaSypt,因为。只是为了保密,这似乎并不重要。但在实践中,你需要对照你的威胁模型来检查这一点

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


您不需要Bouncy Castle。AES被认为是安全的;Bouncy Castle所做的一切(例如使用JaSypt的示例)都是添加晦涩的密码。在上面的列表中,除AES之外的所有东西都不如AES安全。

不需要。请使用做出所有正确决策的包装器库。阅读我已将问题更改为直接解释哪个scheme提供“最高安全级别”。要求非现场解释/指示是离题的,要求“最佳”是主观的。这两个都是结束问题的原因。@bayou.io是的,你可以。因为你的代码容易受到攻击,因为它不使用常规MAC,而是使用加密哈希。如果你使用加密哈希进行身份验证,例如,可能会受到填充oracle攻击。不要使用注释作为答案,特别是因为我们无法对em.@bayou.io您也在使用ECB模式。您以前创建过加密包装器库吗?如果没有,请不要将它们作为答案发布。@MaartenBodewes——如果我不先暴露我的无知,我该如何向您学习?:)问题,在我的情况下,我希望能够在不要求最终用户安装无限加密文件的情况下分发代码,因为这几乎肯定超出了不太懂技术的用户的能力。我真正想要的是在不使用无限强度文件的情况下能够得到的最强加密。也许我应该修改一下这个问题,说得同样多。是的,你应该这样做。默认情况下没有AES 128算法可用,您在哪个运行时运行?我在Oracle的标准Java 8 JDK上运行。它有一个AES 128算法可用,但每当我尝试在实践中使用它时,就会出现异常。