Kotlin 中的密码学:加密与哈希

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Kotlin中的密码学:加密与哈希

运行在JVM之上的Kotlin提供了对Java强大密码学库的完全访问权限,例如Java Cryptography Extension (JCE)和Bouncy Castle。在本文中,我们将探讨如何在Kotlin中实现对称加密(AES)、非对称加密(RSA)以及哈希(SHA-256)。所有代码示例均可直接运行——您可以将其复制到自己的项目中。



项目准备

首先,在build.gradle.kts中添加对Bouncy Castle的依赖(推荐用于现代算法的提供者):

dependencies {    implementation("org.bouncycastle:bcprov-jdk15on:1.70")}

同步Gradle后,在代码中导入提供者:

import org.bouncycastle.jce.provider.BouncyCastleProviderimport java.security.Security

fun initCrypto() { Security.addProvider(BouncyCastleProvider())}


1. SHA-256哈希

哈希是一种不可逆的数据转换。最常用于验证文件完整性和存储密码。

import java.security.MessageDigest

fun sha256(input: String): String { val digest = MessageDigest.getInstance("SHA-256") val hashBytes = digest.digest(input.toByteArray()) return hashBytes.joinToString("") { "%02x".format(it) }}

fun main() { val password = "mySecret123" val hash = sha256(password) println("SHA-256哈希: $hash") // 输出: SHA-256哈希: a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3}

重要提示:对于密码,请使用bcrypt或scrypt——SHA-256速度过快,容易受到暴力攻击。



2. 对称加密AES

AES(高级加密标准)是最流行的数据加密算法。我们使用GCM模式(保证真实性)和随机IV。

import javax.crypto.Cipherimport javax.crypto.KeyGeneratorimport javax.crypto.SecretKeyimport javax.crypto.spec.GCMParameterSpecimport java.util.Base64

class AesGcmEncryption { companion object { private const val AES_KEY_SIZE = 256 private const val GCM_IV_LENGTH = 12 private const val GCM_TAG_LENGTH = 128 }

fun generateKey(): SecretKey { val keyGen = KeyGenerator.getInstance("AES") keyGen.init(AES_KEY_SIZE) return keyGen.generateKey() }

fun encrypt(plainText: String, secretKey: SecretKey): String { val cipher = Cipher.getInstance("AES/GCM/NoPadding") val iv = ByteArray(GCM_IV_LENGTH).apply { java.security.SecureRandom().nextBytes(this) } cipher.init(Cipher.ENCRYPT_MODE, secretKey, GCMParameterSpec(GCM_TAG_LENGTH, iv)) val cipherText = cipher.doFinal(plainText.toByteArray()) // 合并IV和密文 val combined = iv + cipherText return Base64.getEncoder().encodeToString(combined) }

fun decrypt(encryptedData: String, secretKey: SecretKey): String { val combined = Base64.getDecoder().decode(encryptedData) val iv = combined.copyOfRange(0, GCM_IV_LENGTH) val cipherText = combined.copyOfRange(GCM_IV_LENGTH, combined.size) val cipher = Cipher.getInstance("AES/GCM/NoPadding") cipher.init(Cipher.DECRYPT_MODE, secretKey, GCMParameterSpec(GCM_TAG_LENGTH, iv)) return String(cipher.doFinal(cipherText)) }}

fun main() { val aes = AesGcmEncryption() val key = aes.generateKey() val original = "秘密消息" val encrypted = aes.encrypt(original, key) val decrypted = aes.decrypt(encrypted, key) println("原文: $original") println("加密后: $encrypted") println("解密后: $decrypted")}


3. 非对称

推荐