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

在Android中主密钥被弃用后如何创建主密钥

凤衡
2023-03-14

我使用下面的代码来存储我的应用程序中加密的一些信息。

    val masterKey = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC)

    val sharedPreferences = EncryptedSharedPreferences.create(
        "secret_shared_prefs",
        masterKey,
        this,
        EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
        EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
    )

由于Android中不推荐使用MasterKey类,所以我应该使用MasterKey类,但我无法找到正确的方法来定义相同的MasterKey。

有人能显示与可用的MasterKey和MasterKey. Builder类的精确匹配吗?

下面的解决方案是这样工作的:

val spec = KeyGenParameterSpec.Builder(
        "_androidx_security_master_key_",
        KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
    )
        .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
        .setKeySize(256)
        .build()

    val masterKey: MasterKey = MasterKey.Builder(this)
        .setKeyGenParameterSpec(spec)
        .build()

    val sharedPreferences = EncryptedSharedPreferences.create(
        this,
        "secret_shared_prefs",
        masterKey, // masterKey created above
        EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
        EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM);

共有3个答案

须捷
2023-03-14

你可以用这两种方法中的任何一种

KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(
     MASTER_KEY_ALIAS,
     KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
     .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
     .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
     .setKeySize(KEY_SIZE)
     .build();

MasterKey masterKey = new MasterKey.Builder(MainActivity.this)
     .setKeyGenParameterSpec(spec)
     .build();

MasterKey masterKey = new 
              MasterKey.Builder(context,MasterKey.DEFAULT_MASTER_KEY_ALIAS).
              setKeyScheme(MasterKey.KeyScheme.AES256_GCM).build();

万能钥匙。KeyScheme。AES256_GCM内部使用与上述相同的密钥生成器。

汤英豪
2023-03-14

我今天也有同样的问题。有关修复/解决方法,请参见下文(示例在Java代码中,但在Kotlin中也可以轻松实现)

>

 // this is equivalent to using deprecated MasterKeys.AES256_GCM_SPEC
 KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(
         MASTER_KEY_ALIAS,
         KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
         .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
         .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
         .setKeySize(KEY_SIZE)
         .build();

 MasterKey masterKey = new MasterKey.Builder(MainActivity.this)
         .setKeyGenParameterSpec(spec)
         .build();

创建加密共享首选项使用稍微不同版本的"创建"方法:

 EncryptedSharedPreferences.create(
         MainActivity.this,
         "your-app-preferences-name",
         masterKey, // masterKey created above
         EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
         EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM);

这应该做的技巧:)

参考和更多详细信息:https://devmainapps.blogspot.com/2020/06/android-masterkeys-deprecated-how-to.html

籍利
2023-03-14

试试这个吧


MasterKey masterKey = new MasterKey.Builder(context, MasterKey.DEFAULT_MASTER_KEY_ALIAS)
        .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
        .build();

SharedPreferences sharedPreferences = EncryptedSharedPreferences.create(
        context,
        SHARED_PREF_NAME,
        masterKey,
        EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
        EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM);
 类似资料:
  • 我试图创建一个加密的实现,但Android网站中给出的示例适用于API 23及以上版本。具体来说,问题是使用以下代码创建主密钥:。 在当前版本的androidx Security('androidx.security: security-crypto: 1.1.0-alpha01')上,您可以从技术上为创建实现,除了上面的函数状态仅适用于API 23及以上版本。因此,如果我理解正确,我唯一缺少的就

  • 我需要为不同的用户旋转一堆EC2框。每个用户都应该从所有其他用户中沙盒化,所以每个EC2框都需要自己的SSH键。 在Terraform中实现这一点的最佳方法是什么? 我找到的几乎所有指令都希望我手动创建SSH密钥并将其粘贴到terraform脚本中。 (错误)示例: https://github.com/hashicorp/terraform/issues/1243, http://2ninjas

  • 问题内容: 我完全不了解这个过程。我已经能够导航到Java SDK中包含keytool的文件夹。尽管我不断收到错误,但openssl无法识别为内部或外部命令。问题是,即使我可以解决这个问题,我该怎么办?之后怎么办? 问题答案: 这是你需要做的 从代码 提取中下载openSSl 。在C:/中创建一个文件夹-OpenSSL,然后在此处复制提取的代码。 检测debug.keystore文件路径。如果找不

  • 此代码引发异常。如何验证SSH指纹而不将其存储在文件中?我相信下面的代码是为公钥设计的。但带有SFTP服务器的客户端验证了指纹,但没有为我获取公钥。 代码基于使用PysFTP验证主机密钥。

  • 如何为密钥对创建X509证书?(我的类已经有了密钥对,我需要创建一个证书来保存我的公钥,然后将其存储在密钥库中)。 我期望有一个X509证书构造函数能够接收我的公钥,然后通过keystore.set条目(pvtkey,cert)存储它,但我没有发现任何有用的关联新证书和我的密钥对... 任何想法? 编辑:我也试图通过证书链为空,但它不起作用,它看起来像一个错误报告http://bugs.sun.c