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.pswp.cn/diannao/80397.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/80397.shtml
英文地址,請注明出處:http://en.pswp.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;避免因為版本…