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
Auch in der Bibliothek
Arbeit mit Kafka in Java: Bibliotheken, Konfiguration und Codebeispiele
Aufgabenwarteschlangen für PHP: RabbitMQ, Beanstalkd und Gearman
Generierung von QR-Codes mit PHP: Bibliothek phpqrcode und vollständiger Leitfaden
CLI-Frameworks für Java: Picocli, JCommander und Spring Shell
Axios — HTTP-Client für JavaScript (Node.js)