Kryptographie in Kotlin: Verschlüsselung und Hashing

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Kryptographie in Kotlin: Verschlüsselung und Hashing

Kotlin, das auf der JVM läuft, bietet vollen Zugriff auf die leistungsstarken kryptographischen Bibliotheken von Java, wie Java Cryptography Extension (JCE) und Bouncy Castle. In diesem Artikel betrachten wir, wie man symmetrische (AES), asymmetrische (RSA) Verschlüsselung sowie Hashing (SHA-256) in Kotlin implementiert. Alle Codebeispiele sind ausführungsbereit – Sie können sie in Ihr Projekt kopieren.



Projektvorbereitung

Fügen Sie zunächst die Abhängigkeit zu Bouncy Castle (empfohlener Provider für moderne Algorithmen) in Ihre build.gradle.kts ein:

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

Importieren Sie nach der Gradle-Synchronisation den Provider im Code:

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

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


1. SHA-256 Hashing

Hashing ist eine irreversible Transformation von Daten. Es wird am häufigsten zur Überprüfung der Dateiintegrität und zur Speicherung von Passwörtern verwendet.

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: $hash") // Ausgabe: SHA-256 Hash: a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3}

Wichtig: Verwenden Sie für Passwörter bcrypt oder scrypt – SHA-256 ist zu schnell und anfällig für Brute-Force-Angriffe.



2. Symmetrische AES-Verschlüsselung

AES (Advanced Encryption Standard) ist der beliebteste Algorithmus zur Datenverschlüsselung. Wir verwenden den GCM-Modus (garantiert Authentizität) und einen zufälligen 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()) // Kombiniere IV und Chiffretext 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 = "Geheime Nachricht" val encrypted = aes.encrypt(original, key) val decrypted = aes.decrypt(encrypted, key) println("Original: $original") println("Verschlüsselt: $encrypted") println("Entschlüsselt: $decrypted")}


3. Asymmetrisch

Empfehlungen