我正在尝试使用带有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时支持的唯一密码块模式。
答案 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安全警告我。