不应使用ECB模式的密码

时间:2016-03-15 16:00:31

标签: android encryption rsa android-keystore

我正在尝试使用带有RSA密钥对的Cipher"AndroidKeyStore"。在我可以找到的所有Android文档中,示例显示Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding")Cipher.getInstance("RSA/ECB/PKCS1Padding")。这两个都在Android Studio上提出了相同的警告:

  

不应使用ECB加密

     

不应使用ECB作为密码模式调用Cipher#getInstance,或者不设置密码模式,因为android上的默认模式是ECB,这是不安全的。

显然我不能省略它,或者将模式设置为None,因为默认值是ECB。如果ECB模式不安全,我应该使用哪种模式?

如果我使用任何其他模式(我知道),我会得到NoSuchAlgorithmException: No provider found for RSA/{mode}/OAEPWithSHA-256AndMGF1Padding。填充可能是问题吗?

无论哪种方式,根据Android KeyStore System文档,ECB模式似乎是它在使用RSA时支持的唯一密码块模式。

3 个答案:

答案 0 :(得分:18)

这看起来像Android Studio中用于查找问题的Android Lint中的错误。该警告的目的是警告使用具有对称密码的ECB块模式,例如AES。但是,对于RSA,没有必要对此进行警告,因为RSA / ECB / ... Cipher只接受/处理一个输入块。

我建议您针对Android Lint在https://code.google.com/p/android/中提交错误。

答案 1 :(得分:7)

我喜欢这个解释(from Maarten Bodewes):

  

"RSA/ECB/PKCS1Padding"实际上并没有实施ECB模式加密。它应该被称为"RSA/None/PKCS1Padding",因为它只能用于加密单个明文块(或者实际上是一个密钥)。这只是Sun / Oracle的命名错误。

如果您的Android版本包含BouncyCastle,那么您可以使用None代替ECB

答案 2 :(得分:-1)

通过改变" AES / ECB / PKCS5PADDING"到" AES / CBC / PKCS5PADDING"修好了这个lint安全警告我。