Android-KeyStore安全的存储系统


在 Android 中,AndroidKeyStore 是一个安全的存储系统,用于存储加密密钥。它提供了一种安全的方式来生成、存储和管理密钥,而无需将密钥暴露给应用程序本身。以下是如何使用 AndroidKeyStore 的基本步骤和示例代码。

检查 AndroidKeyStore 是否可用

AndroidKeyStore 在 Android API 18(Android 4.3)及以上版本中可用。确保你的应用支持这些版本。if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) {// AndroidKeyStore 不可用return;
}

完整 Java 示例

import android.security.keystore.KeyGenParameterSpec;
import android.security.keystore.KeyProperties;import java.nio.charset.StandardCharsets;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import javax.crypto.Cipher;public class AndroidKeyStoreExample {// 密钥库类型private static final String PP_KEYSTORE_TYPE = "AndroidKeyStore";// 密钥库别名private static final String PP_KEYSTORE_ALIAS = "pp_keystore_alias";// 加密算法标准名称private static final String PP_TRANSFORMATION = "RSA/ECB/PKCS1Padding";public static void main(String[] args) {try {// 创建 RSA 密钥对createRsaKeyPair(PP_KEYSTORE_ALIAS);// 获取公钥和私钥PublicKey publicKey = getPublicKey(PP_KEYSTORE_ALIAS);PrivateKey privateKey = getPrivateKey(PP_KEYSTORE_ALIAS);// 原始数据String originalText = "Hello, AndroidKeyStore!";System.out.println("Original Text: " + originalText);// 使用公钥加密数据byte[] encryptedData = encryptData(publicKey, originalText.getBytes(StandardCharsets.UTF_8));System.out.println("Encrypted Data: " + new String(encryptedData, StandardCharsets.UTF_8));// 使用私钥解密数据byte[] decryptedData = decryptData(privateKey, encryptedData);System.out.println("Decrypted Data: " + new String(decryptedData, StandardCharsets.UTF_8));} catch (Exception e) {e.printStackTrace();}}/*** 创建 RSA 密钥对*/public static void createRsaKeyPair(String alias) throws Exception {KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, PP_KEYSTORE_TYPE);KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(alias,KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT).setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1).build();keyPairGenerator.initialize(spec);keyPairGenerator.generateKeyPair();}/*** 获取公钥*/public static PublicKey getPublicKey(String alias) throws Exception {KeyStore keyStore = KeyStore.getInstance(PP_KEYSTORE_TYPE);keyStore.load(null); // 加载 AndroidKeyStorereturn keyStore.getCertificate(alias).getPublicKey();}/*** 获取私钥*/public static PrivateKey getPrivateKey(String alias) throws Exception {KeyStore keyStore = KeyStore.getInstance(PP_KEYSTORE_TYPE);keyStore.load(null); // 加载 AndroidKeyStorereturn (PrivateKey) keyStore.getKey(alias, null);}/*** 使用公钥加密数据*/public static byte[] encryptData(PublicKey publicKey, byte[] data) throws Exception {Cipher cipher = Cipher.getInstance(PP_TRANSFORMATION);cipher.init(Cipher.ENCRYPT_MODE, publicKey);return cipher.doFinal(data);}/*** 使用私钥解密数据*/public static byte[] decryptData(PrivateKey privateKey, byte[] encryptedData) throws Exception {Cipher cipher = Cipher.getInstance(PP_TRANSFORMATION);cipher.init(Cipher.DECRYPT_MODE, privateKey);return cipher.doFinal(encryptedData);}
}

代码说明

1. 创建 RSA 密钥对
  • 使用 KeyPairGeneratorKeyGenParameterSpec 创建一个 RSA 密钥对。
  • KeyGenParameterSpec.Builder 用于指定密钥的用途(加密和解密)、填充方式等配置。
2. 获取公钥和私钥
  • 公钥通过 KeyStore.getCertificate(alias).getPublicKey() 获取。
  • 私钥通过 KeyStore.getKey(alias, null) 获取。
3. 加密数据
  • 使用公钥和指定的加密算法(RSA/ECB/PKCS1Padding)对数据进行加密。
4. 解密数据
  • 使用私钥和相同的加密算法对加密后的数据进行解密。

运行结果

假设原始数据是 "Hello, AndroidKeyStore!",运行程序后会输出:

Original Text: Hello, AndroidKeyStore!
Encrypted Data: [加密后的二进制数据]
Decrypted Data: Hello, AndroidKeyStore!

注意事项

  1. API 版本要求

    • AndroidKeyStore 支持 API 18 及以上版本。
    • 如果需要在更低版本中实现类似功能,可以考虑使用其他加密库(如 Bouncy Castle)。
  2. 异常处理

    • 在实际开发中,务必捕获并处理可能抛出的异常,例如:
      • KeyStoreException
      • NoSuchAlgorithmException
      • InvalidKeyException
      • IllegalBlockSizeException
      • BadPaddingException
  3. 安全性

    • 使用 setUserAuthenticationRequired(true) 可以要求用户认证(如指纹或 PIN 码)才能访问密钥。
    • 避免将敏感数据存储在内存中太久,减少泄露风险。
  4. 填充方式

    • PKCS1Padding 是常用的填充方式,但如果你需要更高的安全性,可以考虑更现代的填充方式(如 OAEP)。

通过以上代码和解释,你应该能够理解如何在 Android 应用中使用 AndroidKeyStore 来安全地生成密钥、加密和解密数据。如果有进一步的问题,请随时提问!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/80397.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv12 改进有效系列目录 - 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制 - 针对多尺度、小目标、遮挡、复杂环境、噪声等问题!

&#x1f525; 在 YOLO 系列一路狂飙之后&#xff0c;YOLOv12 带来了令人耳目一新的范式转变——它不再以 CNN 为绝对核心&#xff0c;而是首次 围绕注意力机制构建 YOLO 框架&#xff0c;在保证实时性的前提下&#xff0c;将检测精度再次推向新高度&#xff01; 为了进一步探…

网络准入控制系统:2025年网络安全的坚固防线

在当今数字化时代&#xff0c;网络安全已成为至关重要的议题。阳途网络准入控制系统作为保障网络安全的关键机制&#xff0c;发挥着不可替代的作用。 阳途网络准入控制系统核心目的在于确保只有合法、合规的设备与用户能够接入网络。从本质上讲&#xff0c;它通过一系列技术手段…

Graph Database Self-Managed Neo4j 知识图谱存储实践2:通过官方新手例子入门(未完成)

官方入门例子&#xff1a;neo4j-graph-examples/get-started: An introduction to graph databases and Neo4j for new users 官方例子仓库&#xff1a;https://github.com/neo4j-graph-examples 下载数据 git clone https://github.com/neo4j-graph-examples/get-started …

百度搜索AI开放计划:助力开发者通过MCP Server连接用户和应用

百度搜索AI开放计划&#xff1a;助力开发者通过MCP Server连接用户和应用 一、背景 2025年4月25日&#xff0c;百度在Create开发者大会上发布了全新的AI开放计划。这一计划的核心目的是实现用户和AI应用、MCP Server的高效链接&#xff0c;提供更流畅的互动体验&#xff0c;推…

方案精读:77页2024 集团企业IT技术架构规划方案【附全文阅读】

本文概述了集团企业2024年度IT技术架构规划方案的首课&#xff0c;旨在通过TOGAF企业架构框架方法论&#xff0c;系统规划并优化技术架构。项目核心目标在于结合集团信息化建设愿景与当前技术架构现状&#xff0c;制定前瞻性、标准化的技术架构规划及发展策略&#xff0c;以支撑…

C++ 日志系统实战第三步:熟悉掌握各种设计模式

全是通俗易懂的讲解&#xff0c;如果你本节之前的知识都掌握清楚&#xff0c;那就速速来看我的项目笔记吧~ 相关技术知识补充&#xff0c;也是最后的补充知识了~ 下文将加入项目代码编写&#xff01; 目录 设计模式 单例模式 饿汉模式 懒汉模式 工厂模式 简单…

开源作业调度框架Quartz框架详细使用说明

Quartz框架详细使用说明 Quartz 是一个功能强大的开源作业调度框架&#xff0c;广泛用于在Java应用程序中执行定时任务。以下是Quartz框架的详细使用说明、完整代码示例、同类框架对比以及总结表格。 1. Quartz框架概述 特点&#xff1a; 灵活的调度&#xff1a;支持多种调度方…

Java实现背景图片加自适应水印图片

由于每张图片的宽高比例不一致&#xff0c;希望使得水印在每张图上的尺寸可以跟随背景图变化&#xff0c;自动调整水印大小。避免每张背景的图所显示的logo水印不至于那么突兀。 一、导入所需Jar包 <dependency><groupId>cn.hutool</groupId><artifactId…

代理ip和实际ip的区别和联系

在互联网时代&#xff0c;IP地址是每个设备连接网络的“身份证”&#xff0c;但你是否知道IP地址还分为‌代理IP‌和‌实际IP‌&#xff1f;它们各自扮演什么角色&#xff1f;为什么有人选择使用代理IP&#xff1f;实际IP又有哪些不可替代的作用&#xff1f;本文将深入解析代理…

mybatis-plus里的com.baomidou.mybatisplus.core.override.MybatisMapperProxy 类的详细解析

以下是 com.baomidou.mybatisplus.core.override.MybatisMapperProxy 类的详细解析&#xff1a; 1. 类的作用 MybatisMapperProxy 是 MyBatis-Plus 框架中用于实现 Mapper 接口动态代理的核心类。它继承自 MyBatis 的 MapperProxy&#xff0c;并扩展了以下功能&#xff1a; …

Memcached 主主复制架构搭建与 Keepalived 高可用实现

实验目的 掌握基于 repcached 的 Memcached 主主复制配置 实现通过 Keepalived 的 VIP 高可用机制 验证数据双向同步及故障自动切换能力 实验环境 角色IP 地址主机名虚拟 IP (VIP)主节点10.1.1.78server-a10.1.1.80备节点10.1.1.79server-b10.1.1.80 操作系统: CentOS 7 软…

如何成功防护T级超大流量的DDoS攻击

防护T级超大流量的DDoS攻击需要综合技术、架构与运营策略的多层次防御体系。以下是基于最新技术实践和行业案例总结的关键防护策略&#xff1a; 一、流量清洗与分布式处理 部署流量清洗中心 T级攻击的核心防御依赖于专业的流量清洗技术。通过部署分布式流量清洗集群&#xff0c…

基于SpringAI Alibaba实现RAG架构的深度解析与实践指南

一、RAG技术概述 1.1 什么是RAG技术 RAG&#xff08;Retrieval-Augmented Generation&#xff09;检索增强生成是一种将信息检索技术与生成式AI相结合的创新架构。它通过以下方式实现智能化内容生成&#xff1a; 知识检索阶段&#xff1a;从结构化/非结构化数据源中检索相关…

数字化技术的五个环节:大数据、云计算、人工智能、区块链、移动互联网

在21世纪的科技浪潮中&#xff0c;数字化技术以其强大的生命力和无限的潜力&#xff0c;正逐步重塑着我们的世界。大数据、云计算、人工智能、区块链、移动互联网&#xff0c;这五大数字化技术的环节&#xff0c;如同构建智慧未来的基石&#xff0c;每一方面都承载着推动社会进…

Java Web容器分类及对比

Java Web容器分类及对比 1. 按功能分类 (1) Servlet/JSP容器&#xff08;轻量级&#xff0c;仅支持Web层&#xff09; Tomcat 特点&#xff1a;轻量级、开源、仅支持Servlet/JSP规范&#xff0c;适合Web应用。 使用方式&#xff1a; // 通过Maven依赖启动Spring Boot应用&…

【Java并发】【LinkedBlockingQueue】适合初学体质的LinkedBlockingQueue入门

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 欢迎点赞、收藏、关注&#xff0c;跟上我的更新节奏 &#x1f4da;欢迎订阅专栏…

Python在AI虚拟教学视频开发中的核心技术与前景展望

Python在AI虚拟教学视频开发中的核心技术与前景展望 一、引言&#xff1a;AI虚拟教学的技术革新 随着教育数字化转型加速&#xff0c;AI虚拟教学视频凭借个性化、沉浸式体验成为教育科技的新风口。Python以其强大的多模态处理能力、丰富的开源生态和跨领域兼容性&#xff0c;成…

shadcn/radix-ui的tooltip高度定制arrow位置

尝试了半天&#xff0c;后来发现&#xff0c;不支持。。。。。就是不支持 那箭头只能居中 改side和align都没用&#xff0c;下面有在线实例 https://codesandbox.io/p/sandbox/radix-ui-slider-forked-zgn7hj?file%2Fsrc%2FApp.tsx%3A69%2C21 但是呢&#xff0c; 第一如果…

自动清空 maven 项目临时文件,vue 的 node_modules 文件

echo off setlocal enabledelayedexpansion :: vue 的 node_modules 太大 :: maven 打包后的 target 文件也很大&#xff0c; :: 有些项目日志文件也很大&#xff0c;导致磁盘空间不足了&#xff0c; :: 所以写了个脚本&#xff0c;只要配置一下各项目目录&#xff0c; :: 双击…

[Mybatis-plus]

简介 MyBatis-Plus &#xff08;简称 MP&#xff09;是一个 MyBatis的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变。Mybatis-plus官网地址 注意&#xff0c;在引入了mybatis-plus之后&#xff0c;不要再额外引入mybatis和mybatis-spring&#xff0c;避免因为版本…