Criptografia em Kotlin: criptografia e hash
Kotlin, sendo uma linguagem moderna para a JVM, fornece acesso a todos os recursos do Java Cryptography Architecture (JCA). Isso permite implementar tanto criptografia simétrica (AES, DES) quanto assimétrica (RSA), além de funções de hash criptográfico (SHA-256, MD5) e assinaturas digitais. Neste artigo, abordaremos exemplos práticos de uso de criptografia em Kotlin que serão úteis para proteger dados em aplicações web, desenvolvimento móvel e serviços de backend.
Todos os exemplos de código utilizam recursos nativos do Java, tornando-os multiplataforma e sem necessidade de bibliotecas adicionais.
1. Criptografia simétrica AES em Kotlin
A criptografia simétrica usa a mesma chave para criptografar e descriptografar. O algoritmo AES (Advanced Encryption Standard) é o padrão ouro de segurança. Vejamos um exemplo de criptografia de string usando o modo CBC e 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) // Tamanho da chave: 128, 192 ou 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) // Vetor de inicialização (16 bytes para AES) // Em um projeto real, iv deve ser aleatório e transmitido junto com o texto cifrado val original = "Olá, Kotlin!" val encrypted = encryptAES(original, key, iv) val decrypted = decryptAES(encrypted, key, iv) println("Original: $original") println("Criptografado: $encrypted") println("Descriptografado: $decrypted")}Importante: O vetor de inicialização (IV) deve ser aleatório para cada criptografia e transmitido abertamente junto com os dados criptografados. Nunca use um IV fixo em produção.
2. Criptografia assimétrica RSA em Kotlin
RSA usa um par de chaves: pública (public) para criptografar e privada (private) para descriptografar. Isso é ideal para a transmissão segura de dados 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) // Tamanho de chave 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 Também na biblioteca
Prisma para TypeScript: guia completo com exemplos
Mocha para JavaScript (Node.js): guia completo com exemplos