wun*_*tee 32 java cryptography aes
有谁知道默认的Java加密行为是什么:
SecretKeySpec localSecretKeySpec = new SecretKeySpec(arrayOfByte, "AES");
Cipher localCipher = Cipher.getInstance("AES");
Run Code Online (Sandbox Code Playgroud)
具体来说,我希望了解这些类如何生成IV,以及仅指定"AES"时的默认加密模式是什么.谢谢.
bra*_*tan 34
对于Oracle JDK 7(已测试),AES的默认密码为AES/ECB/PKCS5Padding.虽然Java安全文档没有提到这一点(http://docs.oracle.com/javase/6/docs/technotes/guides/security/StandardNames.html#algspec),但还是要做一些JUnit测试来查找.
laz*_*laz 11
这些细节是提供者特定的,依赖于默认模式和填充可能非常危险.如果您对当前与Java捆绑的默认提供程序使用的值感兴趣,则必须查找相关算法的源代码.例如,它用于RSA算法的默认值在这里.此外,Java™加密体系结构(JCA)参考指南提供了相当多的信息,可以回答您的其他一些问题.
Jav*_*ier 11
细节是提供者特定的.在JCA参考指南说:
(创建密码对象)如果未指定模式或填充,则使用模式和填充方案的特定于提供程序的缺省值.例如,SunJCE提供程序使用ECB作为默认模式,PKCS5Padding作为DES,DES-EDE和Blowfish密码的默认填充方案.这意味着在SunJCE提供程序的情况下:Cipher.getInstance("DES")和Cipher.getInstance("DES/ECB/PKCS5Padding")是等效的语句.
我总是使用完整的形式(算法/模式/填充),不仅因为我认为将这些"细节"遗漏给实现是不好的做法,而且也是为了实现独立于所选提供者的密文(通常是加密存储/传输,然后无法确定相同的提供程序将在以后/另一端使用).
小智 5
这取决于提供者。不同的提供者可能有不同的默认参数。这是 Java 8 的链接。
https://docs.oracle.com/javase/8/docs/technotes/guides/security/SunProviders.html#ciphertrans
javax.crypto.Cipher.getInstance(String transformation) 工厂方法使用算法/模式/填充形式的转换生成密码。如果省略模式/填充,SunJCE 和 SunPKCS11 提供程序使用 ECB 作为默认模式,使用 PKCS5Padding 作为许多对称密码的默认填充。
建议使用完全指定算法、模式和填充的转换,而不是依赖默认值。
注意:ECB 适用于单块数据,可以并行化,但一般不应用于多块数据。
因此,您不应只使用 AES,而应指定模式和填充。此外,虽然 getInstance 方法可以为提供者提供另一个参数,但不推荐这样做,因为
应用程序绑定到其他 Java 实现上可能不可用的特定提供程序
| 归档时间: |
|
| 查看次数: |
21433 次 |
| 最近记录: |