标签: android-keystore

如何在不知道密码时重置密钥库?

出于某种原因,我收到了这条消息:

keytool error: java.io.IOException: Keystore was tampered with, or password was incorrect

我知道我无法"修复"密钥库,但我想重置密钥库,但不知道该怎么做,特别是因为我不知道默认密钥库的位置.

注意:我只想要"空白",所以我从默认重启.我仍然无法察觉他们的位置.

如何使用keytool或类似名称列出默认密钥库及其位置?

java keytool android-keystore

8
推荐指数
1
解决办法
3万
查看次数

发布未签名的.apk文件的问题?

关于签名和未签名的.apk文件有很多问题.对于测试和调试,我们可以使用在bin文件夹中生成的unsigned .apk文件.这个apk文件使用虚拟密钥库文件生成.我的问题是为什么我们需要使用签名的apk.我们不能发布一个未签名的apk.那有什么不对?

android keystore apk android-keystore

8
推荐指数
1
解决办法
5739
查看次数

如何使用Android密钥库提供商存储密钥

我正在尝试使用Android 4.3中可用的Android密钥库提供程序来安全地保存私钥,然后使用此私钥来加密和解码数据.

我认为到目前为止我已经实现了正确的方法和代码,但是我目前面临着一个我无法弄清楚的奇怪问题.

我有一个名为KeyStorage的类,我用它来创建密钥对,加载KeyStore并检索私钥,这个类的代码如下:

public class KeyStorage {

public static final String ANDROID_KEYSTORE = "AndroidKeyStore";
private KeyStore keyStore;

public void loadKeyStore() {
    try {
        keyStore = KeyStore.getInstance(ANDROID_KEYSTORE);
        keyStore.load(null);
        Enumeration<String> aliases = keyStore.aliases();
        while(aliases.hasMoreElements())
            Log.e("E", "Aliases = " + aliases.nextElement());
    } catch (Exception e) {
        // TODO: Handle this appropriately in your app
        e.printStackTrace();
    }
}

public void generateNewKeyPair(String alias, Context context)
        throws Exception {

    Calendar start = Calendar.getInstance();
    Calendar end = Calendar.getInstance();
    // expires 1 year from today
    end.add(1, Calendar.YEAR); …
Run Code Online (Sandbox Code Playgroud)

encryption android android-keystore private-key

8
推荐指数
1
解决办法
1万
查看次数

4.1 API上的AndroidKeystore

我正在使用AndroidKeystore当前项目中的提供程序来安全地存储私钥.现在我想让我的应用程序可用于较低版本的Android 4.1(API版本16).因此,我需要找到一个替代品,AndroidKeystore但很难找到任何可用的解决方案.是否有任何建议如何实现/模拟/替换AndroidKeystore这些旧版本的功能?

此外,KeyPairGeneratorSpec自v18起可用.什么是旧版本的正确替代品?

security android android-keystore android-developer-api

8
推荐指数
1
解决办法
3210
查看次数

Android KeyStoreException未知错误

我试图在用户通过Android M指纹API进行身份验证后解密加密文本.我一直在尝试遵循Android安全示例以及KeyGenParameterSpec文档中提供的示例.我已经能够成功地加密与公钥的文本,但是当我打电话cipher.doFinalCipher在使用私有密钥DECRYPT_MODE,我得到一个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 …
Run Code Online (Sandbox Code Playgroud)

encryption android keystore android-keystore android-fingerprint-api

8
推荐指数
1
解决办法
4093
查看次数

在Android应用中存储凭据

我们如何安全地存储凭据数据以访问Android应用中的smtp-server?这些数据是常量,只有开发人员应该知道它们.目前它们存储在代码中,但这不安全,因为可以通过反编译应用程序来查看它们.

是否有可能为此目的使用Android Keystore System以及如何使用?最重要的是,Android Keystore在root设备上是否有效?

encryption android credentials root android-keystore

8
推荐指数
2
解决办法
4508
查看次数

无法使用Google Play应用程序签名上传证书更新发布APK(使用原始密钥库)

我试图更新Google Play上的版本.上传我签名的APK后,我在Google Play控制台中收到了以下错误消息:

您上传了未使用上传证书签名的APK.您必须使用相同的证书.上传证书有指纹:

[SHA1 :( SHA1哈希编辑) ]

用于签署您上传的APK的证书有指纹:

[SHA1 :( 不匹配的SHA1哈希编辑) ]

我已经尝试了许多不同的方法来签署我的APK(原始密钥库,不同的密码组合,新的密钥库,不同的密钥组合等),但没有一个成功.

我相当确信密钥库是原始密钥库,因为我将它备份在外部驱动器上,并且文件的两个版本的更新日期在原始版本之前大约30分钟(这是我生成第一个签名的APK时).

由于我使用了Google Play应用程序签名(并且预期的SHA1哈希与我的Play控制台上"应用程序签名"选项卡中的上载证书SHA1哈希相同)我假设我需要将证书导入到我上传的密钥库中原始发布APK.

这是我的结果,我已经反复检查了一段时间,以确保它们不是由简单的错字引起的(编辑的部分按值分组为颜色,如果需要,我可以发布大部分颜色):

无法使用Google Play应用程序签名上传证书更新发布APK(使用原始密钥库)

请注意,keystorePass和实际keyPass被指定为不同的传递,因此使用keystorePassfor两者都返回"无法恢复密钥"UnrecoverableKeyException,而使用keyPass密钥时会给出一般异常"回复中的公钥和密钥库不匹配".

我的一些研究表明,如果keystorePasskeyPass不相同,那么就会出现这个问题.建议的解决方案是使用keytool将其更改keyPass为与之相同keystorePass,但在我假设是一个成功的keytool keypasswd更改后,我仍然得到异常"回复中的公钥和密钥库不匹配".使用旧的keyPass返回预期的错误密码异常.这是一个截图:

无法使用Google Play应用程序签名上传证书更新发布APK(使用原始密钥库)

出于疑难解答的目的,我尝试将证书直接添加到密钥库.这是成功使用,keystorePass并给了我uploade_cert.der从谷歌播放应用程序签名文件的预期SHA1哈希:

无法使用Google Play应用程序签名上传证书更新发布APK(使用原始密钥库)

我还尝试创建一个新的密钥库(以及使用相同密码的原始密钥库和新密钥库中的新密钥),但尝试在成功执行keytool上载证书导入后使用带有新密钥库的Android Studio生成签名的APK,我收到了此Android Studio错误:"受信任的证书条目未受密码保护"

我已经在我的gradle app文件中尝试了所有这些步骤与原始和新的信息,signingConfigs{release{keyAlias, keyPassword, storeFile, storePassword}}但没有运气.很想让我的应用程序更新,任何提示或帮助将不胜感激.

keytool apk android-keystore android-studio google-play-console

8
推荐指数
1
解决办法
2721
查看次数

KeyStore 与 KeyChain

我有一个生成加密/解密密钥的应用程序,它运行良好。我将我的密钥存储在 KeyStore 和 IV 中,作为保存在外部存储上的加密文件中的第一个 12B。当我想解密文件时,我从外部存储中获取文件(因此我得到了 IV)和 KeyStore 中的密钥,并且我能够获取原始内容。我的第二个应用程序 App2 可以访问外部存储中的文件(因此它可以获取 IV),但无法从 App1 KeyStore 获取密钥。我正在阅读有关 KeyChain 的内容,它在官方文档中说它不是应用程序私有的(当您需要系统范围的凭据时,请使用 KeyChain API)。我可以以某种方式将我的密钥存储在这个 KeyChain 或其他地方,以便我的 App2 可以获取它(经过一些用户批准或类似的东西)。这是我用来在 App1 中创建和存储密钥的代码。

 private static SecretKey createAndStoreKey() {
        KeyGenerator keyGen;
        try {
            // Generate 256-bit key
            keyGen = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, KEY_STORE_NAME);

            final KeyGenParameterSpec keyGenParameterSpec = new KeyGenParameterSpec.Builder(KEY_ALIAS,
                    KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
                    .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
                    .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
                    .build();

            keyGen.init(keyGenParameterSpec);

            SecretKey secretKey = keyGen.generateKey();
            if(secretKey != null)
                return secretKey;
            else
                return null;
        }
        catch (NoSuchProviderException e){
            e.printStackTrace();
            return null;
        }
        catch (NoSuchAlgorithmException e) {
            e.printStackTrace(); …
Run Code Online (Sandbox Code Playgroud)

encryption android android-keystore

8
推荐指数
1
解决办法
5368
查看次数

如何从 deployment_cert.der 文件计算 Facebook 的密钥哈希?

我已将我的应用 APK 上传到谷歌并启用应用签名密钥让谷歌注册我的应用。现在,我需要 Facebook 请求的部署密钥哈希,我确实下载了用于生成指纹的 deployment_cert.der 文件,但我没有知道如何通过 facebook 计算所需的密钥哈希。请不要告诉我如何从密钥库生成密钥哈希,因为我已经为测试目的生成了密钥哈希,我想知道的是发布版本的密钥哈希我的应用 APK 由 google 签名。

android facebook sha android-keystore android-studio

8
推荐指数
1
解决办法
596
查看次数

Keystore getEntry 在 Android 9 上返回 NULL

c 我已经加密和解密了存储在 Android Keystore 中的登录密码。在 Android 9 上,我观察到应用程序在尝试解密密码时崩溃(我无法重现它,但拥有 Pixel 3 的人是崩溃的设备之一)。下面是我从密钥库解密密码的方法。

private static final String TRANSFORMATION = "AES/GCM/NoPadding";
private static final String ANDROID_KEY_STORE = "AndroidKeyStore";

private KeyStore keyStore;

public Decryptor() throws CertificateException, NoSuchAlgorithmException, KeyStoreException,
        IOException {
    initKeyStore();
}

private void initKeyStore() throws KeyStoreException, CertificateException,
        NoSuchAlgorithmException, IOException {
    keyStore = KeyStore.getInstance(ANDROID_KEY_STORE);
    keyStore.load(null);
}

@TargetApi(19)
public String decryptData(final String alias, final byte[] encryptedData, final byte[] encryptionIv)
        throws UnrecoverableEntryException, NoSuchAlgorithmException, KeyStoreException,
        NoSuchProviderException, NoSuchPaddingException, InvalidKeyException, IOException,
        BadPaddingException, IllegalBlockSizeException, InvalidAlgorithmParameterException {

    final Cipher cipher = …
Run Code Online (Sandbox Code Playgroud)

security encryption android android-keystore android-9.0-pie

8
推荐指数
0
解决办法
732
查看次数