本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点
在移动端开发中,数据加密是确保数据传输和存储安全的重要手段。常见的加密算法包括对称加密算法(如 AES)、非对称加密算法(如 RSA)、散列算法(如 SHA-256),以及消息认证码(如 HMAC)。
常见的移动端加密算法
对称加密算法(Symmetric Encryption)
- AES(Advanced Encryption Standard):AES 是目前较为流行的对称加密算法,支持密钥长度为 128 位、192 位或 256 位。对称加密的特点是加密和解密使用同一个密钥。
- DES(Data Encryption Standard):是一种较老的对称加密算法,因其密钥长度较短(56 位)而不再推荐使用。
非对称加密算法(Asymmetric Encryption)
- RSA:RSA 是一种广泛使用的非对称加密算法,使用一对公钥和私钥进行加密和解密。非对称加密的特点是加密和解密使用不同的密钥,适合于密钥交换和数字签名。
散列算法(Hash Algorithms)
- SHA-256(Secure Hash Algorithm 256-bit):一种常用的散列算法,将输入的数据生成固定长度的散列值,用于数据完整性校验和数字签名。
- MD5(Message Digest Algorithm 5):较老的散列算法,已被发现存在安全漏洞,不再推荐使用。
消息认证码(Message Authentication Codes, MACs)
- HMAC(Hash-based Message Authentication Code):结合了散列算法和密钥的消息认证码,用于确保数据的完整性和真实性。
使用 Kotlin 进行 AES-256 加密和解密
我们将介绍如何使用 Kotlin 实现 AES-256 加密和解密。以下是所需的步骤:
- 生成密钥
- 加密数据
- 解密数据
工具和库
在 Kotlin 中,我们通常使用 Java 提供的加密库 javax.crypto
来实现这些功能。
代码示例
- 依赖导入
确保你的项目中已经导入了必要的依赖:
dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib")
}
- 密钥生成
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()
}
- 加密和解密
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)
}
- 测试加密和解密
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查看更多精彩文章!