寻求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
相关产品推荐
相关产品推荐

