Криптография в Kotlin: шифрование и хеширование
Современная разработка на Kotlin (особенно для Android и бэкенда) часто требует реализации криптографических функций. В этой статье мы рассмотрим основные подходы к шифрованию и хешированию данных с использованием Kotlin и стандартных библиотек Java Cryptography Extension (JCE) и Bouncy Castle.
Основные понятия
Криптография в Kotlin опирается на возможности JVM. Вы можете использовать:
- Симметричное шифрование (AES, DES) — один ключ для шифрования и расшифровки.
- Асимметричное шифрование (RSA) — пара ключей: публичный и приватный.
- Хеширование (SHA-256, MD5) — необратимое преобразование данных.
- HMAC — хеширование с секретным ключом для проверки целостности.
Настройка проекта
Для большинства примеров достаточно стандартной библиотеки Java. Для расширенных алгоритмов (например, AES с GCM) добавьте в build.gradle.kts зависимость:
dependencies {
implementation("org.bouncycastle:bcprov-jdk15on:1.70")
}
1. Симметричное шифрование (AES)
AES — самый популярный алгоритм. Пример шифрования и расшифровки строки:
import javax.crypto.Cipher
import javax.crypto.KeyGenerator
import javax.crypto.SecretKey
import javax.crypto.spec.IvParameterSpec
import java.util.Base64
fun aesEncrypt(plainText: String, secretKey: SecretKey): String {
val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding")
val iv = ByteArray(16) // Генерация IV
java.security.SecureRandom().nextBytes(iv)
cipher.init(Cipher.ENCRYPT_MODE, secretKey, IvParameterSpec(iv))
val encrypted = cipher.doFinal(plainText.toByteArray())
// Объединяем IV и шифротекст
val combined = iv + encrypted
return Base64.getEncoder().encodeToString(combined)
}
fun aesDecrypt(encryptedBase64: String, secretKey: SecretKey): String {
val combined = Base64.getDecoder().decode(encryptedBase64)
val iv = combined.copyOfRange(0, 16)
val encrypted = combined.copyOfRange(16, combined.size)
val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding")
cipher.init(Cipher.DECRYPT_MODE, secretKey, IvParameterSpec(iv))
return String(cipher.doFinal(encrypted))
}
// Использование
fun main() {
val keyGen = KeyGenerator.getInstance("AES")
keyGen.init(256)
val secretKey = keyGen.generateKey()
val original = "Hello, Kotlin Crypto!"
val encrypted = aesEncrypt(original, secretKey)
println("Зашифровано: $encrypted")
val decrypted = aesDecrypt(encrypted, secretKey)
println("Расшифровано: $decrypted")
}
2. Асимметричное шифрование (RSA)
RSA используется для безопасной передачи данных. Пример:
import java.security.KeyPairGenerator
import java.security.PrivateKey
import java.security.PublicKey
import javax.crypto.Cipher
import java.util.Base64
fun generateRSAKeyPair(): Pair<PublicKey, PrivateKey> {
val generator = KeyPairGenerator.getInstance("RSA")
generator.initialize(2048)
val keyPair = generator.generateKeyPair()
return Pair(keyPair.public, keyPair.private)
}
fun rsaEncrypt(plainText: String, publicKey: PublicKey): String {
val cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding")
cipher.init(Cipher.ENCRYPT_MODE, publicKey)
return Base64.getEncoder().encodeToString(cipher.doFinal(plainText.toByteArray()))
}
fun rsaDecrypt(encryptedBase64: String, privateKey: PrivateKey): String {
val cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding")
cipher.init(Cipher.DECRYPT_MODE, privateKey)
return String(cipher.doFinal(Base64.getDecoder().decode(encryptedBase64)))
}
fun main() {
val (publicKey, privateKey) = generateRSAKeyPair()
val message = "Секретное сообщение"
val encrypted = rsaEncrypt(message, publicKey)
println("RSA зашифровано: $encrypted")
val decrypted = rsaDecrypt(encrypted, privateKey)
println("RSA расшифровано: $decrypted")
}
3. Хеширование (SHA-256)
Хеширование используется для проверки целостности и хранения паролей (с солью).
import java.security.MessageDigest
import java.security.SecureRandom
fun sha256Hash(input: String): String {
val digest = MessageDigest.getInstance("SHA-256")
val hashBytes = digest.digest(input.toByteArray())
return hashBytes.joinToString("") { "%02x".format(it) }
}
fun hashWithSalt(password: String): Pair<String, String> {
val salt = ByteArray(16)
Secure Также в библиотеке
Marten для C# (.NET): полное руководство с примерами
Планировщик задач на Rust: создание надёжного job scheduler
Реактивное программирование в C# (.NET) — Observable, Rx.NET и LINQ
Тестирование в Java: фреймворки и инструменты (JUnit, TestNG, Mockito)