【发布时间】:2017-08-13 04:35:37
【问题描述】:
我正在做 android 数据加密以保存在 SharedPreferences 中。 GCMParameterSpec 是在 Android 的 API 19 中引入的,我将其用于AES/GCM/NoPadding 加密。这就是我实现它的方式:
Cipher c = Cipher.getInstance("AES/GCM/NoPadding");
c.init(Cipher.ENCRYPT_MODE, getSecretKey(context),new GCMParameterSpec(128,Base64.decode(myGeneratedIV, Base64.DEFAULT)));
我的问题是,在 Android 4.4.2 (API 19) 中,我得到了提到的错误,但从 API 21 开始它可以工作。
关于异常,来自 Android 文档:
如果给定的算法参数不适合此密码,或者此密码需要算法参数并且 params 为空,或者给定的算法参数暗示的加密强度将超过法律限制(由配置的管辖权政策文件确定) .
我的问题是:这种行为是否有特定原因?为什么 Cipher 中的 init 方法不能识别参数?
我什至尝试在不提供特定 IV 的情况下进行加密:
c.init(Cipher.ENCRYPT_MODE, getSecretKey(context));
一旦我尝试以同样的方式解密:
c.init(Cipher.DECRYPT_MODE, getSecretKey(context));
它抛出相同的异常(InvalidAlgorithmParameterException)说需要GCMParameterSpec 进行解密。
我尝试将GCMParameterSpec 仅用于解密,但我得到了未知参数类型异常。
感谢任何帮助
【问题讨论】:
-
感谢您的反馈@MaartenBodewes。我最终为 API 19 定义了一种不同的加密模式。除了 GCM 之外,我还寻找一种可行且安全的加密方式,它也使用 IV,我选择使用“AES/CBC/PKCS5Padding”。
-
我将 IvParamaterSpec 与 AES/GCM/NoPadding 一起使用,并且效果很好。谢谢
-
由于 Cipher 的实例是 AES/GCM,尽管我不得不使用 GCMParameterSpec,这也是我从未尝试过使用 IvParamaterSpec 的主要原因。工作得很好,我能够避免使用 AES/CBC
-
对于到达这里的任何人,我设法通过使用
ProviderInstallerdeveloper.android.com/training/articles/… 更新安全提供程序解决了同样的问题
标签: java android encryption cryptography aes-gcm