You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求Android Studio中Kotlin版KeyChain最新示例指引

Android Kotlin KeyChain 实用示例与核心要点

1. 权限配置

首先在AndroidManifest.xml中添加必要权限:

<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />

2. 请求KeyChain访问权限(获取密钥别名)

使用最新的ActivityResultAPI替代已弃用的onActivityResult,示例如下:

import android.app.Activity
import android.content.Intent
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.result.contract.ActivityResultContracts
import android.security.KeyChain

class KeyChainDemoActivity : ComponentActivity() {
    private val chooseAliasLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        if (result.resultCode == Activity.RESULT_OK) {
            // 获取选中的密钥别名
            val alias = result.data?.getStringExtra(KeyChain.EXTRA_KEY_ALIAS)
            alias?.let {
                // 后续处理:获取密钥、证书等
                loadKeyPair(it)
            }
        }
    }

    // 触发选择密钥别名的界面
    fun requestKeyAlias() {
        val intent = Intent(KeyChain.ACTION_CHOOSE_PRIVATE_KEY_ALIAS).apply {
            // 可选:指定证书类型过滤,比如RSA
            putExtra(KeyChain.EXTRA_KEY_TYPE, "RSA")
            // 可选:指定允许的用途,比如数字签名
            putExtra(KeyChain.EXTRA_PURPOSE, KeyChain.PURPOSE_SIGN)
        }
        chooseAliasLauncher.launch(intent)
    }
}

3. 加载密钥对与证书

拿到别名后,加载对应的私钥和证书链:

import java.security.PrivateKey
import java.security.cert.X509Certificate
import android.security.KeyChain

private fun loadKeyPair(alias: String) {
    // 异步加载,避免阻塞主线程
    Thread {
        try {
            val privateKey: PrivateKey? = KeyChain.getPrivateKey(this, alias)
            val certChain: Array<X509Certificate>? = KeyChain.getCertificateChain(this, alias)
            
            // 成功获取后,可用于加密、签名等操作
            runOnUiThread {
                // 更新UI或处理业务逻辑
            }
        } catch (e: Exception) {
            e.printStackTrace()
            // 处理异常:比如权限未授予、别名不存在等
        }
    }.start()
}

4. 导入密钥对到KeyChain

如果需要生成并导入密钥对,可使用KeyPairGenerator生成后,通过KeyChain.setKeyPairEntry导入(注意:该操作需要用户授权):

import java.security.KeyPairGenerator
import java.security.spec.RSAKeyGenParameterSpec
import android.security.KeyChain

private fun generateAndImportKeyPair() {
    Thread {
        try {
            // 生成RSA密钥对
            val keyPairGenerator = KeyPairGenerator.getInstance("RSA")
            keyPairGenerator.initialize(RSAKeyGenParameterSpec(2048, RSAKeyGenParameterSpec.F4))
            val keyPair = keyPairGenerator.generateKeyPair()

            // 导入到KeyChain,需要用户确认
            KeyChain.setKeyPairEntry(
                this,
                "my_custom_alias", // 自定义别名
                keyPair.private,
                keyPair.public,
                null // 证书链,若无需证书可传null
            )
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }.start()
}

核心注意事项

  • KeyChain是系统级安全存储,所有操作需用户明确授权,无法静默执行
  • 禁止在主线程调用KeyChain的同步方法(如getPrivateKey),建议放在子线程处理
  • 上述代码适配Android 10+及更低版本,使用ActivityResultAPI需依赖androidx.activity:activity-ktx库

内容的提问来源于stack exchange,提问作者Beel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 05:21:13