- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试在用户通过 Android M Fingerprint API 进行身份验证后解密加密文本。我一直在尝试关注 Android Security samples ,以及 KeyGenParameterSpec
中提供的示例文档。我已经能够使用公钥成功加密文本,但是当我使用 DECRYPT_MODE
中的私钥通过 Cipher
调用 cipher.doFinal
时>,我得到一个 KeyStoreException
“未知错误”:
03-15 10:06:58.074 14702-14702/com.example.app E/LoginFragment: Failed to decrypt password
javax.crypto.IllegalBlockSizeException
at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:486)
at javax.crypto.Cipher.doFinal(Cipher.java:1502)
at com.example.app.ui.fragment.util.LoginFragment.onAuthenticationSucceeded(LoginFragment.java:251)
at com.example.app.ui.controller.FingerprintCallback.onAuthenticationSucceeded(FingerprintCallback.java:21)
at android.support.v4.hardware.fingerprint.FingerprintManagerCompat$Api23FingerprintManagerCompatImpl$1.onAuthenticationSucceeded(FingerprintManagerCompat.java:301)
at android.support.v4.hardware.fingerprint.FingerprintManagerCompatApi23$1.onAuthenticationSucceeded(FingerprintManagerCompatApi23.java:96)
at android.hardware.fingerprint.FingerprintManager$MyHandler.sendAuthenticatedSucceeded(FingerprintManager.java:805)
at android.hardware.fingerprint.FingerprintManager$MyHandler.handleMessage(FingerprintManager.java:757)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: android.security.KeyStoreException: Unknown error
at android.security.KeyStore.getKeyStoreException(KeyStore.java:632)
at android.security.keystore.KeyStoreCryptoOperationChunkedStreamer.doFinal(KeyStoreCryptoOperationChunkedStreamer.java:224)
at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:473)
at javax.crypto.Cipher.doFinal(Cipher.java:1502)
at com.example.app.ui.fragment.util.LoginFragment.onAuthenticationSucceeded(LoginFragment.java:251)
at com.example.app.ui.controller.FingerprintCallback.onAuthenticationSucceeded(FingerprintCallback.java:21)
at android.support.v4.hardware.fingerprint.FingerprintManagerCompat$Api23FingerprintManagerCompatImpl$1.onAuthenticationSucceeded(FingerprintManagerCompat.java:301)
at android.support.v4.hardware.fingerprint.FingerprintManagerCompatApi23$1.onAuthenticationSucceeded(FingerprintManagerCompatApi23.java:96)
at android.hardware.fingerprint.FingerprintManager$MyHandler.sendAuthenticatedSucceeded(FingerprintManager.java:805)
at android.hardware.fingerprint.FingerprintManager$MyHandler.handleMessage(FingerprintManager.java:757)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
当前相关代码如下:
public KeyStore getKeyStore() {
try {
return KeyStore.getInstance("AndroidKeyStore");
} catch (KeyStoreException exception) {
throw new RuntimeException("Failed to get an instance of KeyStore", exception);
}
}
public KeyPairGenerator getKeyPairGenerator() {
try {
return KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
} catch(NoSuchAlgorithmException | NoSuchProviderException exception) {
throw new RuntimeException("Failed to get an instance of KeyPairGenerator", exception);
}
}
public Cipher getCipher() {
try {
return Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
} catch(NoSuchAlgorithmException | NoSuchPaddingException exception) {
throw new RuntimeException("Failed to get an instance of Cipher", exception);
}
}
private void createKeyPair() {
try {
mKeyPairGenerator.initialize(
new KeyGenParameterSpec.Builder(KEY_ALIAS, KeyProperties.PURPOSE_DECRYPT)
.setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP)
.setUserAuthenticationRequired(true)
.build());
mKeyPairGenerator.generateKeyPair();
} catch(InvalidAlgorithmParameterException exception) {
throw new RuntimeException("Failed to generate key pair", exception);
}
}
private boolean initCipher(int opmode) {
try {
mKeyStore.load(null);
if(opmode == Cipher.ENCRYPT_MODE) {
PublicKey key = mKeyStore.getCertificate(KEY_ALIAS).getPublicKey();
PublicKey unrestricted = KeyFactory.getInstance(key.getAlgorithm())
.generatePublic(new X509EncodedKeySpec(key.getEncoded()));
mCipher.init(opmode, unrestricted);
} else {
PrivateKey key = (PrivateKey) mKeyStore.getKey(KEY_ALIAS, null);
mCipher.init(opmode, key);
}
return true;
} catch (KeyPermanentlyInvalidatedException exception) {
return false;
} catch(KeyStoreException | CertificateException | UnrecoverableKeyException
| IOException | NoSuchAlgorithmException | InvalidKeyException
| InvalidAlgorithmParameterException exception) {
throw new RuntimeException("Failed to initialize Cipher", exception);
}
}
private void encrypt(String password) {
try {
initCipher(Cipher.ENCRYPT_MODE);
byte[] bytes = mCipher.doFinal(password.getBytes());
String encryptedPassword = Base64.encodeToString(bytes, Base64.NO_WRAP);
mPreferences.getString("password").set(encryptedPassword);
} catch(IllegalBlockSizeException | BadPaddingException exception) {
throw new RuntimeException("Failed to encrypt password", exception);
}
}
private String decrypt(Cipher cipher) {
try {
String encryptedPassword = mPreferences.getString("password").get();
byte[] bytes = Base64.decode(encryptedPassword, Base64.NO_WRAP);
return new String(cipher.doFinal(bytes));
} catch (IllegalBlockSizeException | BadPaddingException exception) {
throw new RuntimeException("Failed to decrypt password", exception);
}
}
什么可能导致这个“未知错误”?我已经排除了 setUserAuthenticationRequired
,但我不知道是什么原因造成的。我还尝试使用全局 mCipher
而不是 FragmentManagerCompat.AuthenticationCallback.onAuthenticationSucceeded
提供的 Cipher
(不过,我认为它们应该是一个和相同),结果相同。
我在寻找 another one of my questions 的答案时遇到了这个问题.
最佳答案
我在 Android Issue Tracker 上找到了答案;根据我的理解,不受限制的 PublicKey
是为解决另一个 known issue 而创建的, 与当前的 Cipher
不兼容。解决方法是在初始化 Cipher
时指定一个 OAEPParameterSpec
:
OAEPParameterSpec spec = new OAEPParameterSpec(
"SHA-256", "MGF1", MGF1ParameterSpec.SHA1, PSource.PSpecified.DEFAULT);
mCipher.init(opmode, unrestricted, spec);
关于Android KeyStoreException 未知错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36015194/
使用下一个描述获取崩溃: Caused by java.security.UnrecoverableKeyException: Failed to obtainX.509 form of public
我正在尝试在用户通过 Android M Fingerprint API 进行身份验证后解密加密文本。我一直在尝试关注 Android Security samples ,以及 KeyGenParam
我有一个 Android 应用程序,它使用 Android 安全 keystore 来加密/解密帐户信息。 最小 SDK 设置为 23,因此有效的 keystore 应该始终可用,但是,我收到了少量关
我无法在 Android 上解密之前加密的字符串。问题主要出现在运行 Android 6 Marshmallow 的索尼设备(Xperia Z5 和 Xperia Z5 Compact)上。 andr
我的目标是从 CAC 卡中读取信息并使用 pkcs11 从中提取信息并签署我的文档。我找不到适合我的硬件的 dll,因此我在我的计算机上安装了 openSC 并在以下代码中使用了 opensc-pkc
我们已经生成了 AndroidKeystore,它工作正常但随机遇到以下问题。 App重新安装后运行正常。 java.security.KeyStoreException: Failed to sto
我试图通过模拟 KeyStore 和 KeyStore.getInstance(KEYSTORE_TYPE) 来覆盖 KeyStoreException block 。但是当我模拟 KeyStore
如何在java sun keytool中创建.bks keystore ,我应该做什么? C:\Program Files\Java\jdk1.6.0\jre\bin>keytool -genkey
我尝试生成一个 RSA CA key 对和证书并将其保存到 keystore 。我的代码是: import java.io.FileOutputStream; import java.math.Big
我无法从 Android 上的 KeyStore 获取(私有(private)) key 。问题主要出现在三星设备(S6、S6 Edge)和 Android 6 上。 android.security
当我尝试在我的 Android 应用程序中对从外部获取的散列值进行签名时,出现上述异常。 生成 key 对的代码是: public static KeyPair generateKeyPair(Con
我将我的 spring boot 项目连接到 mysql 和 cassandra 数据库。当我使用 spring boot 在本地运行它时,一切正常。我使用 docker-compose 来运行这三个
在我们的应用中,我们遇到了 Android keystore 中的数据突然变得无法访问的问题。我们看到的具体异常如下: java.security.UnrecoverableKeyException:
我将我的 spring boot 项目连接到 mysql 和 cassandra 数据库。当我使用 spring boot 在本地运行它时,一切正常。我使用 docker-compose 来运行这三个
背景 在我使用的一个应用程序中,我将重要的东西( token )存储到 EncryptedSharedPreferences 中(取自 here 和 here ): /** a hardware-en
当我尝试创建 JKS 文件,将其写入磁盘,然后运行 keytool 将其转换为 P12 时,出现此错误。我走这条路的原因是因为我无法在代码中获得适用于 iOS 的 P12(不是加密人士)。那里有足
您好,我是 SSL 握手的新手。我已经从浏览器下载了服务器证书并尝试使用 keytool 创建一个 keystore 。我将证书存储为 .cer with der encoding 。但我正在关注 k
我的应用使用 Android 6.0 Fingerprint API 来保护 Android KeyStore 中的 AES key 。存储的 key 只能在用户通过指纹传感器验证时使用,因为 Key
所以我编写了我的应用程序,其中我使用 KeyStore 来加密/解密数据。我还为它编写了一个很好的 Robolectric 测试,但是当我尝试运行测试时,出现以下异常: java.security.K
我遇到 android.security.KeyStoreException: Unknown error 在极少数具有不同 Android 版本 (6 - 8) 的设备上 这是我的 key 生成代码
我是一名优秀的程序员,十分优秀!