Android开发实战班 - 数据持久化 - 数据加密与安全
在 Android 应用开发中,数据安全至关重要,尤其是在处理敏感信息(如用户密码、支付信息、个人隐私数据等)时。数据加密是保护数据安全的重要手段,可以有效防止数据泄露、篡改和未经授权的访问。本章节将介绍 Android 开发中常用的数据加密方法、加密库的使用、安全存储方案以及最佳实践,帮助学员掌握数据加密与安全的实现。
-
什么是数据加密:
- 数据加密是指将明文数据通过加密算法转换为密文数据,只有持有正确密钥的人才能解密并读取数据。
-
数据加密的目的:
- 保密性: 防止数据泄露,确保只有授权用户才能读取数据。
- 完整性: 防止数据被篡改,确保数据的完整性和一致性。
- 身份验证: 验证数据的来源,确保数据来自可信的发送者。
-
加密类型:
- 对称加密: 使用相同的密钥进行加密和解密,例如 AES。
- 非对称加密: 使用一对公钥和私钥进行加密和解密,例如 RSA。
- 哈希加密: 将数据转换为固定长度的哈希值,例如 SHA-256。
18.2 常用加密算法
18.2.1 对称加密
-
AES (Advanced Encryption Standard):
- 高级加密标准,是目前最常用的对称加密算法。
- 密钥长度可以是 128、192 或 256 位。
- 适用于加密大量数据,加密和解密速度快。
import javax.crypto.Cipher import javax.crypto.KeyGenerator import javax.crypto.SecretKey import javax.crypto.spec.SecretKeySpec// 生成 AES 密钥 fun generateAesKey(): SecretKey {val keyGenerator = KeyGenerator.getInstance("AES")keyGenerator.init(256)return keyGenerator.generateKey() }// AES 加密 fun encryptAes(data: ByteArray, key: SecretKey): ByteArray {val cipher = Cipher.getInstance("AES")cipher.init(Cipher.ENCRYPT_MODE, key)return cipher.doFinal(data) }// AES 解密 fun decryptAes(encryptedData: ByteArray, key: SecretKey): ByteArray {val cipher = Cipher.getInstance("AES")cipher.init(Cipher.DECRYPT_MODE, key)return cipher.doFinal(encryptedData) }
18.2.2 非对称加密
-
RSA (Rivest–Shamir–Adleman):
- RSA 是一种常用的非对称加密算法。
- 使用一对公钥和私钥进行加密和解密。
- 适用于加密少量数据,例如加密对称密钥。
import java.security.KeyPairGenerator import java.security.PrivateKey import java.security.PublicKey import javax.crypto.Cipher// 生成 RSA 密钥对 fun generateRsaKeyPair(): KeyPair {val keyPairGenerator = KeyPairGenerator.getInstance("RSA")keyPairGenerator.initialize(2048)return keyPairGenerator.generateKeyPair() }// RSA 加密 fun encryptRsa(data: ByteArray, publicKey: PublicKey): ByteArray {val cipher = Cipher.getInstance("RSA")cipher.init(Cipher.ENCRYPT_MODE, publicKey)return cipher.doFinal(data) }// RSA 解密 fun decryptRsa(encryptedData: ByteArray, privateKey: PrivateKey): ByteArray {val cipher = Cipher.getInstance("RSA")cipher.init(Cipher.DECRYPT_MODE, privateKey)return cipher.doFinal(encryptedData) }
18.2.3 哈希加密
-
SHA-256 (Secure Hash Algorithm 256):
- SHA-256 是一种常用的哈希加密算法。
- 将任意长度的数据转换为 256 位的哈希值。
- 适用于数据完整性校验和密码存储。
import java.security.MessageDigest// SHA-256 哈希 fun sha256(data: String): String {val md = MessageDigest.getInstance("SHA-256")val hashBytes = md.digest(data.toByteArray())return hashBytes.joinToString("") { "%02x".format(it) } }
18.3 Android 中的安全存储
-
Keystore 系统:
- Android 提供了 Keystore 系统,用于安全地存储和管理密钥。
- Keystore 可以生成密钥,并提供安全的密钥存储和加密操作。
- 密钥存储在设备的硬件安全模块中,无法被提取。
import android.security.keystore.KeyGenParameterSpec import android.security.keystore.KeyProperties import java.security.KeyStore// 生成 Keystore 密钥 fun generateKeystoreKey(alias: String) {val keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore")val keyGenParameterSpec = KeyGenParameterSpec.Builder(alias,KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT).setBlockModes(KeyProperties.BLOCK_MODE_GCM).setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE).setKeySize(256).build()keyGenerator.init(keyGenParameterSpec)keyGenerator.generateKey() }// 获取 Keystore 密钥 fun getKeystoreKey(alias: String): SecretKey {val keyStore = KeyStore.getInstance("AndroidKeyStore")keyStore.load(null)return keyStore.getKey(alias, null) as SecretKey }
-
EncryptedFile 和 EncryptedSharedPreferences:
- Android Jetpack 提供了
EncryptedFile
和EncryptedSharedPreferences
,用于加密文件和数据存储。 EncryptedFile
可以对文件进行加密和解密。EncryptedSharedPreferences
可以在 SharedPreferences 中存储加密数据。
import androidx.security.crypto.EncryptedFile import androidx.security.crypto.EncryptedSharedPreferences import androidx.security.crypto.MasterKeys// 使用 EncryptedFile 加密文件 fun writeEncryptedFile(context: Context, fileName: String, content: String) {val masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES_256_GCM_SPEC)val file = File(context.filesDir, fileName)val encryptedFile = EncryptedFile.Builder(file,context,masterKeyAlias,EncryptedFile.FileEncryptionScheme.AES256_SIV).build()encryptedFile.openFileOutput().bufferedWriter().use { writer ->writer.write(content)} }// 使用 EncryptedSharedPreferences 加密 SharedPreferences fun getEncryptedSharedPreferences(context: Context): SharedPreferences {val masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES_256_GCM_SPEC)return EncryptedSharedPreferences.create("secret_shared_prefs",masterKeyAlias,context,EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM) }
- Android Jetpack 提供了
18.4 数据加密最佳实践
-
使用强加密算法:
- 使用经过验证的强加密算法,例如 AES, RSA, SHA-256 等。
-
保护密钥:
- 密钥是加密安全的核心,必须妥善保护。
- 使用 Android Keystore 系统存储和管理密钥,避免密钥泄露。
-
最小权限原则:
- 只存储和传输必要的数据,避免存储敏感信息。
- 最小化权限申请,只申请应用所需的最低权限。
-
安全存储:
- 使用加密存储方案,例如 EncryptedFile, EncryptedSharedPreferences 等。
- 避免在代码中硬编码密钥或敏感信息。
-
数据备份:
- 对敏感数据进行加密备份,避免备份数据泄露。
-
错误处理:
- 妥善处理加密操作中的异常,避免敏感信息泄露。
相关文章:
Android开发实战班 - 数据持久化 - 数据加密与安全
在 Android 应用开发中,数据安全至关重要,尤其是在处理敏感信息(如用户密码、支付信息、个人隐私数据等)时。数据加密是保护数据安全的重要手段,可以有效防止数据泄露、篡改和未经授权的访问。本章节将介绍 Android 开…...

EDA实验设计-led灯管动态显示;VHDL;Quartus编程
EDA实验设计-led灯管动态显示;VHDL;Quartus编程 引脚配置实现代码RTL引脚展示现象记录效果展示 引脚配置 #------------------GLOBAL--------------------# set_global_assignment -name RESERVE_ALL_UNUSED_PINS "AS INPUT TRI-STATED" set_…...
Eclipse 查找功能深度解析
Eclipse 查找功能深度解析 Eclipse 是一款广受欢迎的集成开发环境(IDE),它为各种编程语言提供了强大的开发工具。在本文中,我们将深入探讨 Eclipse 的查找功能,这是开发者日常工作中不可或缺的一部分。无论是查找代码中的特定字符串,还是进行更复杂的搜索,如正则表达式…...
第三百二十九节 Java网络教程 - Java网络UDP套接字
Java网络教程 - Java网络UDP套接字 TCP套接字是面向连接的,基于流。基于UDP的套接字是无连接的,基于数据报。 使用UDP发送的数据块称为数据报或UDP数据包。每个UDP分组具有数据,目的地IP地址和目的地端口号。 无连接套接字在通信之前不建立…...
Leetcode215. 数组中的第K个最大元素(HOT100)
链接 第一次: class Solution { public:int findKthLargest(vector<int>& nums, int k) {sort(nums.begin(),nums.end());int n nums.size();return nums[n-k];} }; 这显然不能出现在面试中,因为面试官考察的不是这个。 正确的代码&#…...
QT与嵌入式——搭建串口
1、源码 由于我需要不止一个串口来进行数据交互,所以简单的封装了一下 void Usb_Init(QString portName, QSerialPort *Port) {Port->setPortName(portName);Port->setBaudRate(QSerialPort::Baud115200); // 设置波特率,根据你的开发板配置修改…...
Shell编程-6
声明:学习视频来自b站up主 泷羽sec,如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址:shell(6)if条件判断与for循环结构_哔哩哔哩_bilibili 一、if条件判断 在Shell脚本中,if语句用于基于条件的评估来执行不同的代码块。…...
使用 Postman 设置 Bearer Token 进行身份验证
学习笔记 1. 打开 Postman 并创建新请求 打开 Postman。 在左上角点击 按钮,创建一个新的请求。 2. 选择 HTTP 方法 在请求类型(默认为 GET)旁边的下拉菜单中,选择你需要的 HTTP 方法,如 POST、GET、PUT 等。 3…...
现在转前端怎么样?
互联网技术日新月异,软件开发者追逐技术浪潮的脚步从未停歇。在这个快速发展的行业中,如何规划自己的职业道路,选择合适的技术方向,成为了许多开发者面临的重要抉择。本文将围绕技术选择这个话题,分享一些深入的思考和…...

【算法一周目】滑动窗口(1)
目录 长度最小的子数组 解题思路 代码实现 无重复字符的最大字串 解题思路 代码实现 最大连续1的个数l l l 解题思路 代码实现 将x减到0的最小操作数 解题思路 代码实现 长度最小的子数组 题目链接:209. 长度最小的子数组题目描述: 给定一个…...

React Native 基础
React 的核心概念 定义函数式组件 import组件 要定义一个Cat组件,第一步要使用 import 语句来引入React以及React Native的 Text 组件: import React from react; import { Text } from react-native; 定义函数作为组件 const CatApp = () => {}; 渲染Text组件...

【C++笔记】list使用详解及模拟实现
前言 各位读者朋友们大家好!上期我们讲了vector的使用以及底层的模拟实现,这期我们来讲list。 目录 前言一. list的介绍及使用1.1 list的介绍1.2 list的使用1.2.1 list的构造1.2.2 list iterator的使用1.2.3 list capacity1.2.4 list element access1.…...

【机器学习】机器学习中用到的高等数学知识-7.信息论 (Information Theory)
熵 (Entropy):用于评估信息的随机性,常用于决策树和聚类算法。交叉熵 (Cross-Entropy):用于衡量两个概率分布之间的差异,在分类问题中常用。 信息论作为处理信息量和信息传输的数学理论,在机器学习中具有广泛的应用。…...

《现代制造技术与装备》是什么级别的期刊?是正规期刊吗?能评职称吗?
问题解答 问:《现代制造技术与装备》是不是核心期刊? 答:不是,是知网收录的第二批认定学术期刊。 问:《现代制造技术与装备》级别? 答:省级。主管单位:齐鲁工业大学࿰…...

09 - Clickhouse的SQL操作
目录 1、Insert 1.1、标准 1.2、从表到表的插入 2、Update和Delete 2.1、删除操作 2.2、修改操作 3、查询操作 3.1、with rollup:从右至左去掉维度进行小计 3.2、with cube : 从右至左去掉维度进行小计,再从左至右去掉维度进行小计 3.3、with …...

如何解决pdf.js跨域从url动态加载pdf文档
摘要 当我们想用PDF.js从URL加载文档时,将会因遇到跨域问题而中断,且是因为会触发了PDF.js和浏览器的双重CORS block,这篇文章将会介绍:①如何禁用pdf.js的跨域?②如何绕过浏览器的CORS加载URL文件?②如何使…...

深入理解TTY体系:设备节点与驱动程序框架详解
往期内容 本专栏往期内容:Uart子系统 UART串口硬件介绍 interrupt子系统专栏: 专栏地址:interrupt子系统Linux 链式与层级中断控制器讲解:原理与驱动开发 – 末片,有专栏内容观看顺序 pinctrl和gpio子系统专栏…...
库的操作(MySQL)
1.创建数据库 语法: CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification:[DEFAULT] CHARACTER SET charset_name[DEFAULT] COLLATE collation_name说明: 大写的表示关键字 [ ] 是可…...
在 for 循环中,JVM可能会将 arr.length 提升到循环外部,仅计算一次。可能会将如何解释 详解
在 Java 的 for 循环中,JVM 有能力进行优化,将 arr.length 的访问提升到循环外部,避免每次迭代都重新计算 arr.length。这种优化主要是由于 JVM 的 即时编译器(JIT) 和 逃逸分析(Escape Analysis࿰…...
回溯--数据在内存中的存储:整数、大小端和浮点数的深度解析
目录 引言 1. 整数在内存中的存储 1.1 原码、反码和补码 1.2 为什么使用补码? 1.3 示例代码:整数的存储 2. 大小端字节序和字节序判断 2.1 什么是大端和小端? 2.2 为什么会有大端和小端之分? 2.3 字节序的判断小程序 2.…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...

R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...