Criptografía en Kotlin: cifrado y hash
Kotlin, al ser un lenguaje moderno para la JVM, proporciona acceso a todas las capacidades de Java Cryptography Architecture (JCA). Esto permite implementar tanto cifrado simétrico (AES, DES) como asimétrico (RSA), así como funciones hash criptográficas (SHA-256, MD5) y firmas digitales. En este artículo analizaremos ejemplos prácticos de uso de criptografía en Kotlin que serán útiles para proteger datos en aplicaciones web, desarrollo móvil y servicios backend.
Todos los ejemplos de código utilizan las capacidades integradas de Java, lo que los hace multiplataforma y sin necesidad de bibliotecas adicionales.
1. Cifrado simétrico AES en Kotlin
El cifrado simétrico utiliza la misma clave para cifrar y descifrar. El algoritmo AES (Advanced Encryption Standard) es el estándar de oro en seguridad. Veamos un ejemplo de cifrado de una cadena usando el modo CBC y PKCS5Padding.
import javax.crypto.Cipherimport javax.crypto.KeyGeneratorimport javax.crypto.SecretKeyimport javax.crypto.spec.IvParameterSpecimport javax.crypto.spec.SecretKeySpecimport java.util.Base64
fun generateAESKey(): SecretKey { val keyGen = KeyGenerator.getInstance("AES") keyGen.init(256) // Longitud de clave: 128, 192 o 256 bits return keyGen.generateKey()}
fun encryptAES(plainText: String, secretKey: SecretKey, iv: ByteArray): String { val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding") val ivSpec = IvParameterSpec(iv) cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec) val encrypted = cipher.doFinal(plainText.toByteArray()) return Base64.getEncoder().encodeToString(encrypted)}
fun decryptAES(encryptedText: String, secretKey: SecretKey, iv: ByteArray): String { val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding") val ivSpec = IvParameterSpec(iv) cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec) val decoded = Base64.getDecoder().decode(encryptedText) val decrypted = cipher.doFinal(decoded) return String(decrypted)}
fun main() { val key = generateAESKey() val iv = ByteArray(16) // Vector de inicialización (16 bytes para AES) // En un proyecto real, iv debe ser aleatorio y transmitirse junto con el texto cifrado val original = "¡Hola, Kotlin!" val encrypted = encryptAES(original, key, iv) val decrypted = decryptAES(encrypted, key, iv) println("Original: $original") println("Cifrado: $encrypted") println("Descifrado: $decrypted")}Importante: El vector de inicialización (IV) debe ser aleatorio para cada cifrado y transmitirse abiertamente junto con los datos cifrados. Nunca uses un IV fijo en producción.
2. Cifrado asimétrico RSA en Kotlin
RSA utiliza un par de claves: una pública (public) para cifrar y una privada (private) para descifrar. Esto es ideal para la transmisión segura de datos entre partes.
import java.security.KeyPairGeneratorimport java.security.PrivateKeyimport java.security.PublicKeyimport javax.crypto.Cipherimport java.util.Base64
fun generateRSAKeyPair(): Pair<PublicKey, PrivateKey> { val keyGen = KeyPairGenerator.getInstance("RSA") keyGen.initialize(2048) // Tamaño de clave recomendado val keyPair = keyGen.generateKeyPair() return Pair(keyPair.public, keyPair.private)}
fun encryptRSA(plainText: String, publicKey: PublicKey): String { val cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding") cipher.init(Cipher.ENCRYPT_MODE, publicKey) val encrypted = cipher.doFinal(plainText.toByteArray()) return Base64.getEncoder().encodeToString(encrypted)}
fun decryptRSA(encryptedText: String, privateKey: PrivateKey): String { val cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding") cipher.init(Cipher.DECRYPT_MODE, privateKey También en la biblioteca
Frameworks CLI para PHP: Symfony Console y Laravel Zero — guía completa
Redis-rs para Rust: guía completa con ejemplos
Caching en PHP: Redis, Memcached, APCu y caching de archivos
Configuración de aplicaciones en Go: mejores prácticas y herramientas
Twilio para JavaScript (Node.js): guía completa con ejemplos