Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 本文介绍了移动端开发中常用的数据加密算法,包括对称加密(如 AES 和 DES)、非对称加密(如 RSA)、散列算法(如 SHA-256 和 MD5)及消息认证码(如 HMAC)。重点讲解了如何使用 Kotlin 实现 AES-256 的加密和解密,并提供了详细的代码示例。通过生成密钥、加密和解密数据等步骤,展示了如何在 Kotlin 项目中实现数据的安全加密。

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

在移动端开发中,数据加密是确保数据传输和存储安全的重要手段。常见的加密算法包括对称加密算法(如 AES)、非对称加密算法(如 RSA)、散列算法(如 SHA-256),以及消息认证码(如 HMAC)。

常见的移动端加密算法

1、 对称加密算法(Symmetric Encryption)

  • AES(Advanced Encryption Standard):AES 是目前较为流行的对称加密算法,支持密钥长度为 128 位、192 位或 256 位。对称加密的特点是加密和解密使用同一个密钥。
  • DES(Data Encryption Standard):是一种较老的对称加密算法,因其密钥长度较短(56 位)而不再推荐使用。

2、 非对称加密算法(Asymmetric Encryption)

  • RSA:RSA 是一种广泛使用的非对称加密算法,使用一对公钥和私钥进行加密和解密。非对称加密的特点是加密和解密使用不同的密钥,适合于密钥交换和数字签名。

3、 散列算法(Hash Algorithms)

  • SHA-256(Secure Hash Algorithm 256-bit):一种常用的散列算法,将输入的数据生成固定长度的散列值,用于数据完整性校验和数字签名。
  • MD5(Message Digest Algorithm 5):较老的散列算法,已被发现存在安全漏洞,不再推荐使用。

4、 消息认证码(Message Authentication Codes, MACs)

  • HMAC(Hash-based Message Authentication Code):结合了散列算法和密钥的消息认证码,用于确保数据的完整性和真实性。

使用 Kotlin 进行 AES-256 加密和解密

我们将介绍如何使用 Kotlin 实现 AES-256 加密和解密。以下是所需的步骤:

  1. 生成密钥
  2. 加密数据
  3. 解密数据

工具和库

在 Kotlin 中,我们通常使用 Java 提供的加密库 javax.crypto 来实现这些功能。

代码示例

  1. 依赖导入

确保你的项目中已经导入了必要的依赖:

dependencies {
   
    implementation("org.jetbrains.kotlin:kotlin-stdlib")
}
  1. 密钥生成

AES-256 需要 256 位(32 字节)的密钥。你可以生成一个随机密钥,或者使用一个固定的密钥(不推荐)。

import javax.crypto.KeyGenerator
import javax.crypto.SecretKey

fun generateAESKey(): SecretKey {
    val keyGen = KeyGenerator.getInstance("AES")
    keyGen.init(256) // 使用 256 位
    return keyGen.generateKey()
}
  1. 加密和解密
import java.util.Base64
import javax.crypto.Cipher
import javax.crypto.SecretKey
import javax.crypto.spec.GCMParameterSpec

private const val AES_ALGORITHM = "AES/GCM/NoPadding"
private const val TAG_LENGTH_BIT = 128
private const val IV_LENGTH_BYTE = 12

fun encrypt(data: String, secretKey: SecretKey): String {
    val cipher = Cipher.getInstance(AES_ALGORITHM)
    val iv = ByteArray(IV_LENGTH_BYTE)
    java.security.SecureRandom().nextBytes(iv)
    val parameterSpec = GCMParameterSpec(TAG_LENGTH_BIT, iv)
    cipher.init(Cipher.ENCRYPT_MODE, secretKey, parameterSpec)
    val encryptedData = cipher.doFinal(data.toByteArray())
    val encryptedIvAndData = ByteArray(iv.size + encryptedData.size)
    System.arraycopy(iv, 0, encryptedIvAndData, 0, iv.size)
    System.arraycopy(encryptedData, 0, encryptedIvAndData, iv.size, encryptedData.size)
    return Base64.getEncoder().encodeToString(encryptedIvAndData)
}

fun decrypt(encryptedData: String, secretKey: SecretKey): String {
    val cipher = Cipher.getInstance(AES_ALGORITHM)
    val encryptedIvAndData = Base64.getDecoder().decode(encryptedData)
    val iv = ByteArray(IV_LENGTH_BYTE)
    System.arraycopy(encryptedIvAndData, 0, iv, 0, iv.size)
    val parameterSpec = GCMParameterSpec(TAG_LENGTH_BIT, iv)
    cipher.init(Cipher.DECRYPT_MODE, secretKey, parameterSpec)
    val originalData = cipher.doFinal(encryptedIvAndData, iv.size, encryptedIvAndData.size - iv.size)
    return String(originalData)
}
  1. 测试加密和解密
fun main() {
    val secretKey = generateAESKey()
    val originalText = "Hello, World!"

    println("Original Text: $originalText")

    val encryptedText = encrypt(originalText, secretKey)
    println("Encrypted Text: $encryptedText")

    val decryptedText = decrypt(encryptedText, secretKey)
    println("Decrypted Text: $decryptedText")
}

代码解释

1、 生成密钥
使用 KeyGenerator 类生成一个 256 位的 AES 密钥。

2、 加密数据

  • 使用 AES/GCM/NoPadding 模式。
  • 生成一个随机的初始化向量(IV)。
  • 使用 IV 和密钥来初始化 Cipher 实例。
  • 执行加密操作并返回 Base64 编码的加密结果。

3、 解密数据

  • 使用 AES/GCM/NoPadding 模式。
  • 从加密数据中提取 IV。
  • 使用 IV 和密钥来初始化 Cipher 实例。
  • 执行解密操作并返回解密后的原始数据。

这样你就能够在 Kotlin 项目中使用 AES-256 实现数据的安全加密和解密。请注意,使用固定密钥不安全,建议使用安全的密钥管理机制来保护密钥。


欢迎关注我的公众号AntDream查看更多精彩文章!

目录
相关文章
|
19天前
|
存储 缓存 算法
前端算法:优化与实战技巧的深度探索
【10月更文挑战第21天】前端算法:优化与实战技巧的深度探索
14 1
|
23天前
|
缓存 前端开发 Android开发
Android实战之如何截取Activity或者Fragment的内容?
本文首发于公众号“AntDream”,介绍了如何在Android中截取Activity或Fragment的屏幕内容并保存为图片。包括截取整个Activity、特定控件或区域的方法,以及处理包含RecyclerView的复杂情况。
18 3
|
2月前
|
Android开发 开发者 索引
Android实战经验之如何使用DiffUtil提升RecyclerView的刷新性能
本文介绍如何使用 `DiffUtil` 实现 `RecyclerView` 数据集的高效更新,避免不必要的全局刷新,尤其适用于处理大量数据场景。通过定义 `DiffUtil.Callback`、计算差异并应用到适配器,可以显著提升性能。同时,文章还列举了常见错误及原因,帮助开发者避免陷阱。
168 9
|
2月前
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
在数据密集型应用中,高效搜索算法至关重要。Trie树(前缀树/字典树)通过优化字符串处理和搜索效率成为理想选择。本文通过Python实战演示Trie树构建与应用,显著提升搜索性能。Trie树利用公共前缀减少查询时间,支持快速插入、删除和搜索。以下为简单示例代码,展示如何构建及使用Trie树进行搜索与前缀匹配,适用于自动补全、拼写检查等场景,助力提升应用性能与用户体验。
51 2
|
2月前
|
算法 搜索推荐 开发者
别再让复杂度拖你后腿!Python 算法设计与分析实战,教你如何精准评估与优化!
在 Python 编程中,算法的性能至关重要。本文将带您深入了解算法复杂度的概念,包括时间复杂度和空间复杂度。通过具体的例子,如冒泡排序算法 (`O(n^2)` 时间复杂度,`O(1)` 空间复杂度),我们将展示如何评估算法的性能。同时,我们还会介绍如何优化算法,例如使用 Python 的内置函数 `max` 来提高查找最大值的效率,或利用哈希表将查找时间从 `O(n)` 降至 `O(1)`。此外,还将介绍使用 `timeit` 模块等工具来评估算法性能的方法。通过不断实践,您将能更高效地优化 Python 程序。
53 4
|
1月前
|
Android开发
Android实战之如何快速实现自动轮播图
本文介绍了在 Android 中使用 `ViewPager2` 和自定义适配器实现轮播图的方法,包括添加依赖、布局配置、创建适配器及实现自动轮播等步骤。
22 0
|
2月前
|
开发工具 Android开发 git
Android实战之组件化中如何进行版本控制和依赖管理
本文介绍了 Git Submodules 的功能及其在组件化开发中的应用。Submodules 允许将一个 Git 仓库作为另一个仓库的子目录,有助于保持模块独立、代码重用和版本控制。虽然存在一些缺点,如增加复杂性和初始化时间,但通过最佳实践可以有效利用其优势。
37 3
|
1月前
|
Android开发
Android开发显示头部Bar的需求解决方案--Android应用实战
Android开发显示头部Bar的需求解决方案--Android应用实战
21 0
|
2月前
|
Java Android开发 UED
🧠Android多线程与异步编程实战!告别卡顿,让应用响应如丝般顺滑!🧵
在Android开发中,为应对复杂应用场景和繁重计算任务,多线程与异步编程成为保证UI流畅性的关键。本文将介绍Android中的多线程基础,包括Thread、Handler、Looper、AsyncTask及ExecutorService等,并通过示例代码展示其实用性。AsyncTask适用于简单后台操作,而ExecutorService则能更好地管理复杂并发任务。合理运用这些技术,可显著提升应用性能和用户体验,避免内存泄漏和线程安全问题,确保UI更新顺畅。
89 5
|
2月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
121 1