0

0

修改 Android KeyStore 中 KeyPair 的用途

碧海醫心

碧海醫心

发布时间:2025-09-09 20:58:25

|

381人浏览过

|

来源于php中文网

原创

修改 android keystore 中 keypair 的用途

本文档介绍了如何在 Android KeyStore 中修改现有 KeyPair 的用途,使其支持密钥协商 (Key Agreement) 操作。通过示例代码展示了如何利用 KeyStore.setEntry 方法在 Android 13 (API 33) 及以上版本中导入 KeyPair 并设置所需的密钥用途属性,解决因缺少 KeyProperties.PURPOSE_AGREE_KEY 属性而导致密钥协商失败的问题。

在 Android 开发中,KeyStore 用于安全地存储密钥。默认情况下,KeyPair 在生成时会设置特定的用途,例如签名 (KeyProperties.PURPOSE_SIGN)。然而,有时我们需要修改 KeyPair 的用途,例如添加密钥协商 (KeyProperties.PURPOSE_AGREE_KEY) 功能。如果直接将通过非 KeyStore 生成的 KeyPair 导入 KeyStore,可能无法满足后续的密钥协商需求,从而导致 java.security.InvalidKeyException: Keystore operation failed 错误。本文将介绍如何在 Android 13 (API 33) 及更高版本中解决这个问题。

解决方案

Android 13 引入了 KeyStore.setEntry 方法,允许我们更灵活地导入 KeyPair 并设置其属性。以下是使用 KeyStore.setEntry 方法导入 KeyPair 并设置 KeyProperties.PURPOSE_AGREE_KEY 属性的示例代码:

import android.security.keystore.KeyProperties;
import android.security.keystore.KeyProtection;

import java.security.KeyStore;
import java.security.KeyStore.PrivateKeyEntry;
import java.security.PrivateKey;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;

public class KeyStoreHelper {

    public static void importKeyPair(KeyStore ks, String alias, PrivateKey privateKey, X509Certificate[] certificateChain) throws Exception {
        PrivateKeyEntry privateKeyEntry = new PrivateKeyEntry(privateKey, certificateChain);

        ks.setEntry(alias, privateKeyEntry,
                new KeyProtection.Builder(KeyProperties.PURPOSE_AGREE_KEY | KeyProperties.PURPOSE_SIGN)
                        .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
                        .build());
    }
}

代码解释:

财到php企业建站系统体验版1.1
财到php企业建站系统体验版1.1

说明:用途:程序员、美工、中小型科技公司接单建站使用1.将此文件夹下的文件传入根目录下2.数据库文件:company.sql3.把数据库文件导入数据库4.修改数据库链接信息(用户名、密码,数据库名):/inc/dabase_mysql.php5.超级帐号webmaster 密码:123456 后台管理目录/cdguanli6.后台栏目配置和前台插件的调用方式,请见官网教程。7.前台插件调用示例相比

下载
  1. 导入必要的类: 导入 KeyProperties 和 KeyProtection 类,用于设置密钥的属性。
  2. 创建 PrivateKeyEntry: 使用 PrivateKey 和 certificateChain 创建一个 PrivateKeyEntry 对象。certificateChain 是一个证书链,用于验证密钥的身份。
  3. 使用 KeyProtection.Builder 设置密钥属性:
    • KeyProperties.PURPOSE_AGREE_KEY | KeyProperties.PURPOSE_SIGN:设置密钥的用途为密钥协商和签名。 可以通过 | 运算符组合多个用途。
    • setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512):设置密钥支持的摘要算法。
  4. 使用 ks.setEntry 导入 KeyPair: 使用 KeyProtection 对象将 PrivateKeyEntry 导入到 KeyStore 中。

使用示例:

import java.security.KeyPair;
import java.security.KeyStore;
import java.security.cert.X509Certificate;

public class ExampleUsage {

    public static void main(String[] args) {
        try {
            // 1. 生成 KeyPair(或者从现有途径获取)
            KeyPair keyPair = YourKeyGenerator.genKeyPair(); // 替换为你的 KeyPair 生成方法

            // 2. 创建自签名证书 (如果需要)
            X509Certificate certificate = CertificateManager.generateSelfSignedX509Certificate(keyPair); // 替换为你的证书生成方法
            X509Certificate[] certificateChain = new X509Certificate[]{certificate};

            // 3. 获取 KeyStore 实例
            KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
            ks.load(null, null);

            // 4. 设置 alias
            String alias = "my_key_alias";

            // 5. 导入 KeyPair 到 KeyStore
            KeyStoreHelper.importKeyPair(ks, alias, keyPair.getPrivate(), certificateChain);

            System.out.println("KeyPair 导入成功!");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注意事项:

  • 确保你的 YourKeyGenerator.genKeyPair() 方法返回一个有效的 KeyPair 对象。
  • CertificateManager.generateSelfSignedX509Certificate(keyPair) 方法需要你自行实现,用于生成自签名证书。
  • 该方法只适用于 Android 13 (API 33) 及以上版本。在较低版本中,你需要使用其他方法来实现类似的功能,例如使用 KeyStore.setKeyEntry 方法,但需要注意其局限性。
  • 如果你的 KeyPair 已经存在于 KeyStore 中,你需要先删除它,然后再使用 KeyStore.setEntry 重新导入。
  • CertificateManager 类和 CertificateBuilder 类需要根据你的具体实现进行调整。

总结:

通过使用 KeyStore.setEntry 方法,我们可以方便地在 Android 13 及以上版本中导入 KeyPair 并设置所需的密钥用途属性,从而解决因缺少 KeyProperties.PURPOSE_AGREE_KEY 属性而导致密钥协商失败的问题。 请根据你的实际情况调整代码,并确保你的应用程序在目标 Android 版本上运行。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1503

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

233

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

87

2025.10.17

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

422

2023.08.14

android开发三大框架
android开发三大框架

android开发三大框架是XUtil框架、volley框架、ImageLoader框架。本专题为大家提供android开发三大框架相关的各种文章、以及下载和课程。

292

2023.08.14

android是什么系统
android是什么系统

Android是一种功能强大、灵活可定制、应用丰富、多任务处理能力强、兼容性好、网络连接能力强的操作系统。本专题为大家提供android相关的文章、下载、课程内容,供大家免费下载体验。

1756

2023.08.22

android权限限制怎么解开
android权限限制怎么解开

android权限限制可以使用Root权限、第三方权限管理应用程序、ADB命令和Xposed框架解开。详细介绍:1、Root权限,通过获取Root权限,用户可以解锁所有权限,并对系统进行自定义和修改;2、第三方权限管理应用程序,用户可以轻松地控制和管理应用程序的权限;3、ADB命令,用户可以在设备上执行各种操作,包括解锁权限;4、Xposed框架,用户可以在不修改系统文件的情况下修改应用程序的行为和权限。

2050

2023.09.19

android重启应用的方法有哪些
android重启应用的方法有哪些

android重启应用有通过Intent、PendingIntent、系统服务、Runtime等方法。本专题为大家提供Android相关的文章、下载、课程内容,供大家免费下载体验。

277

2023.10.18

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

30

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.1万人学习

C# 教程
C# 教程

共94课时 | 8.2万人学习

Java 教程
Java 教程

共578课时 | 55.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号