Android KeyStoreException未知错误

Android KeyStoreException未知错误,第1张

概述我试图在用户通过 Android M指纹API进行身份验证后解密加密文本.我一直在尝试遵循 Android Security samples,以及 KeyGenParameterSpec文档中提供的示例.我已经能够使用公钥成功加密文本,但是当我使用DECRYPT_MODE中的私钥使用Cipher调用cipher.doFinal时,我收到KeyStoreException“Unknown error 我试图在用户通过 Android M指纹API进行身份验证后解密加密文本.我一直在尝试遵循 Android Security samples,以及 KeyGenParameterSpec文档中提供的示例.我已经能够使用公钥成功加密文本,但是当我使用DECRYPT_MODE中的私钥使用Cipher调用cipher.doFinal时,我收到KeyStoreException“UnkNown error”:
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.onAuthenticationSucceeded(FingerprintManagerCompat.java:301)            at androID.support.v4.harDWare.fingerprint.FingerprintManagerCompatAPI23.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.onAuthenticationSucceeded(FingerprintManagerCompat.java:301)             at androID.support.v4.harDWare.fingerprint.FingerprintManagerCompatAPI23.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(尽管我认为它们应该是同一个)提供的密码具有相同的结果.

我在寻找another one of my questions的答案时遇到了这个问题.

解决方法 我在 Android Issue Tracker找到了答案;根据我的理解,为了解决另一个 known issue而创建的不受限制的PublicKey变得与当前的密码不兼容.解决此问题的方法是在初始化密码时指定OAEPParameterSpec:
OAEPParameterSpec spec = new OAEPParameterSpec(        "SHA-256","MGF1",MGF1ParameterSpec.SHA1,PSource.PSpecifIEd.DEFAulT);mCipher.init(opmode,unrestricted,spec);
总结

以上是内存溢出为你收集整理的Android KeyStoreException未知错误全部内容,希望文章能够帮你解决Android KeyStoreException未知错误所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1130560.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存