当前位置: 首页 > 知识库问答 >
问题:

KeyStore找不到别名的密钥

施景同
2023-03-14
public static String encrypt(String alias, String plaintext) {
    try {
        PublicKey publicKey = getPrivateKeyEntry(alias).getCertificate().getPublicKey();
        Cipher cipher = getCipher();
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        return Base64.encodeToString(cipher.doFinal(plaintext.getBytes()), Base64.NO_WRAP);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

private static KeyStore.PrivateKeyEntry getPrivateKeyEntry(String alias) {
    try {
        KeyStore ks = KeyStore
                .getInstance("AndroidKeyStore");
        ks.load(null);
        KeyStore.Entry entry = ks.getEntry(alias, null);

        if (entry == null) {
            Log.w(TAG, "No key found under alias: " + alias);
            Log.w(TAG, "Exiting signData()...");
            return null;
        }

        if (!(entry instanceof KeyStore.PrivateKeyEntry)) {
            Log.w(TAG, "Not an instance of a PrivateKeyEntry");
            Log.w(TAG, "Exiting signData()...");
            return null;
        }
        return (KeyStore.PrivateKeyEntry) entry;
    } catch (Exception e) {
        Log.e(TAG, e.getMessage(), e);
        return null;
    }
}

谢谢!

共有1个答案

赵飞语
2023-03-14

Sonic给出的答案是正确的,因为用于对应用程序进行签名的Java密钥存储与应用程序中使用的密钥存储不同。前者是你的开发机器(笔记本电脑)上的一个文件,而后者只在你安装应用程序的手机上(Android手机或模拟器)。签署您的apk以便它可以在Play Store上发布,以及在您的数据上加密用户的私有数据是不同的过程。

在不清楚的情况下,您应该尝试参考规范的来源,而不是质量差异很大的任意的指南和教程。在这种情况下,KeyStore的官方Android文档有一个存储密钥的完整示例。请注意,Gist中引用的Android密钥库仅在API18+上可用。

诚然,官方文档和要旨中的代码示例相当复杂,很容易出错。一个更好的选择可能是像Scytale这样的东西。它是一个围绕密钥存储库的包装器,可以正确处理API<18的情况。下面是要演示的代码段:

Store store = new Store(getApplicationContext());
if (!store.hasKey("test")) {
   SecretKey key = store.generateSymmetricKey("test", null);
}
...

// Get key
SecretKey key = store.getSymmetricKey("test", null);

// Encrypt/Decrypt data
Crypto crypto = new Crypto(Options.TRANSFORMATION_SYMMETRIC);
String text = "Sample text";

String encryptedData = crypto.encrypt(text, key);
Log.i("Scytale", "Encrypted data: " + encryptedData);

String decryptedData = crypto.decrypt(encryptedData, key);
Log.i("Scytale", "Decrypted data: " + decryptedData);
if there is no key in the keystore with that alias
    make a new key with that alias
use the key to encrypt and decrypt data.
 类似资料:
  • 任务“:app:signReleaseBundle”的执行失败。 执行com时发生故障。Android建筑格雷德尔。内部的任务。Workers$ActionFacade未能从存储“C:\Users\alank\OneDrive\Desktop\Flatter\U app\new app\newapp\android\app\key.jks”读取密钥上载:在密钥库C:\Users\alank\One

  • 我们的android项目由移动和wear应用组成(wear应用正在开发中),我们正在尝试发布移动应用。当我们尝试生成签名的apk时,会得到以下消息: 当它读它说失败的任务:磨损:包装eRelease,实际上我们只是选择移动,而选择签署APK。 有人能指出我的错误吗?提前道谢。

  • 我跟着弗利特。div给出了如何将我的应用部署到google play上的说明,但当我在vs代码中运行Flatter build appbundle时,我遇到了一个问题,它说 执行com时发生故障。Android建筑格雷德尔。内部的任务。Workers$ActionFacade未能从存储“c:\Users\iikxz\upload keystore.jks”读取密钥:在keystore c:\Use

  • 别名s1as被上述命令中使用的别名所取代,即server-alias(在下,上的SSL选项卡)。 jks和cacerts.jks存储在下。 下的JVM选项,上的JVM选项选项卡,以下选项 GlassFish服务器不喜欢什么? 它只在使用别名重新生成这些文件keystore.jks和cacerts.jks时工作,但当使用不同的别名(证书昵称)时,它会失败,出现给定的异常。GlassFish似乎将这个

  • 我是Android安全方面的新手。我已经使用Androidkeystore保存应用程序机密。为了从Android keystore中获得保存的密钥,我需要在每次别名密钥中传递我在加密时传递过的内容。所以,我的问题是,我还想安全地保存别名密钥。因此,没有一个键通过查看代码看到别名键。请帮帮我。

  • null 生成公钥/私钥对,其中私钥从不离开密钥库 将此对的公钥上载到服务器 在服务器上:创建随机对称AES密钥,并用用户上传的公共RSA密钥加密 在设备上:下载此加密的AES密钥 将其导入到硬件支持的密钥存储库中,以便使用该对的私钥对其进行解密,并以新别名存储 使用此新密钥别名执行对称加密和解密 1-4应该是可能的,我现在缺少的环节是第5点。在这个列表中。有没有人可以帮助我,告诉我这是不是可能的