我正在开发一个需要加密存储二进制信息的程序。不幸的是,我似乎找不到一个资源来解释哪些加密方案最适合不同的应用程序。
由于加密很复杂,而我又不是专家,所以我决定使用一个称为Jasypt的库,该库包装了Java内置的加密函数。为了确定可用的算法,我编写了一些单元测试。
第一个测试调用Jasypt的
在运行时,如果您尝试使用某种算法,但该算法由于某些原因不受支持或违反了Java的加密规则,则Jasypt会抛出EncryptionOperationNotPossibleException异常。有趣的是,如果我尝试使用每个“可用”的算法来加密然后解密一些任意数据,并仅打印不抛出该异常的算法,我会得到这个精简列表:
可用算法的列表可以通过引入BouncyCastle JCE并执行
很不幸,我现在不知道这些算法中哪一个最适合我的应用程序。我有一种感觉,AES是正确的选择,并且看起来
这些方案中哪些提供了最高的安全级别,哪些存在明显的安全问题?
编辑:我希望能够分发我的代码,而不需要结束用户安装无限制密码文件,因为这几乎肯定超出了不那么精通技术的用户的能力范围。我真正想要的是在不使用无限制强度管辖区文件的情况下获得最强的加密。
由于加密很复杂,而我又不是专家,所以我决定使用一个称为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
在运行时,如果您尝试使用某种算法,但该算法由于某些原因不受支持或违反了Java的加密规则,则Jasypt会抛出EncryptionOperationNotPossibleException异常。有趣的是,如果我尝试使用每个“可用”的算法来加密然后解密一些任意数据,并仅打印不抛出该异常的算法,我会得到这个精简列表:
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实现,但我不知道去哪里确认这个猜想。这些方案中哪些提供了最高的安全级别,哪些存在明显的安全问题?
编辑:我希望能够分发我的代码,而不需要结束用户安装无限制密码文件,因为这几乎肯定超出了不那么精通技术的用户的能力范围。我真正想要的是在不使用无限制强度管辖区文件的情况下获得最强的加密。