Security Crypto для Kotlin: полное руководство с примерами
В современном мире разработки программного обеспечения безопасность данных является критически важным аспектом. Библиотека Security Crypto для Kotlin предоставляет мощный и удобный инструментарий для шифрования, дешифрования, хеширования и управления ключами. Эта статья представляет собой максимально подробное руководство по использованию библиотеки, начиная от установки и заканчивая сложными практическими примерами.
1. Что это и зачем нужна
Security Crypto — это библиотека для языка программирования Kotlin, предназначенная для выполнения криптографических операций. Она построена на основе стандартных криптографических алгоритмов (AES, RSA, SHA-256, HMAC и других) и предоставляет высокоуровневый API, который значительно упрощает работу с шифрованием по сравнению с использованием низкоуровневых Java Cryptography Extension (JCE) напрямую. Библиотека разработана с учетом лучших практик безопасности, что помогает разработчикам избегать типичных ошибок, таких как использование устаревших алгоритмов или неправильное управление ключами.
Зачем она нужна? В первую очередь, для защиты конфиденциальных данных: паролей, токенов доступа, персональной информации пользователей, банковских данных и любой другой информации, которая не должна быть доступна третьим лицам. Security Crypto позволяет легко реализовать шифрование данных в покое (например, в базе данных) и при передаче (например, через сеть). Кроме того, библиотека предоставляет функции для создания цифровых подписей, проверки целостности данных и безопасного хранения ключей. Это незаменимый инструмент для любого Kotlin-разработчика, работающего над проектами, где требуется высокий уровень безопасности.
Библиотека активно поддерживается сообществом и регулярно обновляется для соответствия современным стандартам безопасности. Она совместима с Kotlin Multiplatform, что позволяет использовать её в проектах для Android, iOS, JVM и JavaScript. Благодаря своей модульной архитектуре, Security Crypto легко интегрируется в существующие проекты и не требует сложной настройки.
2. Установка
Установка библиотеки Security Crypto осуществляется через систему управления зависимостями Gradle (для проектов Kotlin/JVM и Android) или Maven. Ниже приведены точные команды для добавления зависимости в ваш проект.
Для Gradle (Kotlin DSL)
// build.gradle.kts
dependencies {
implementation("io.github.security-crypto:security-crypto-core:2.1.0")
// Для Android добавьте также:
implementation("io.github.security-crypto:security-crypto-android:2.1.0")
}
Для Gradle (Groovy DSL)
// build.gradle
dependencies {
implementation 'io.github.security-crypto:security-crypto-core:2.1.0'
}
Для Maven
<dependency>
<groupId>io.github.security-crypto</groupId>
<artifactId>security-crypto-core</artifactId>
<version>2.1.0</version>
</dependency>
3. Быстрый старт — минимальный рабочий пример
Давайте начнем с простейшего примера: шифрование и дешифрование строки с использованием симметричного алгоритма AES-256-GCM. Этот пример демонстрирует основные шаги: создание ключа, шифрование и дешифрование.
import io.github.securitycrypto.cipher.AesGcmCipher
import io.github.securitycrypto.key.SecretKeyGenerator
import io.github.securitycrypto.util.Base64
fun main() {
// 1. Генерируем секретный ключ (256 бит)
val secretKey = SecretKeyGenerator.generateAesKey(256)
// 2. Создаем экземпляр шифратора AES-GCM
val cipher = AesGcmCipher(secretKey)
// 3. Исходные данные
val plaintext = "Hello, Security Crypto! Это секретное сообщение."
// 4. Шифрование
val encryptedData = cipher.encrypt(plaintext.encodeToByteArray())
println("Зашифрованные данные (Base64): ${Base64.encode(encryptedData)}")
// 5. Дешифрование
val decryptedData = cipher.decrypt(encryptedData)
val decryptedText = decryptedData.decodeToString()
println("Расшифрованные данные: $decryptedText")
// Проверка
require(plaintext == decryptedText) { "Ошибка: исходный и расшифрованный текст не совпадают!" }
println("✅ Успех! Шифрование и дешифрование работают корректно.")
}
4. Основные методы/функции/классы
Ниже приведены 8 ключевых компонентов библиотеки Security Crypto с подробным описанием и примерами использования.
4.1. SecretKeyGenerator.generateAesKey()
Что делает: Генерирует случайный симметричный ключ для алгоритма AES заданной длины. Поддерживаются размеры 128, 192 и 256 бит.
import io.github.securitycrypto.key.SecretKeyGenerator
fun exampleGenerateKey() {
// Генерация 256-битного ключа
val key256 = SecretKeyGenerator.generateAesKey(256)
println("256-битный ключ: ${key256.encoded}")
// Генерация 128-битного ключа
val key128 = SecretKeyGenerator.generateAesKey(128)
println("128-битный ключ: ${key128.encoded}")
// Попытка сгенерировать ключ неподдерживаемого размера
// SecretKeyGenerator.generateAesKey(64) // Выбросит IllegalArgumentException
}
4.2. AesGcmCipher.encrypt()
Что делает: Шифрует массив байтов с использованием алгоритма AES-256-GCM. Возвращает зашифрованные данные, которые включают nonce (12 байт), ciphertext и тег аутентификации (16 байт).
import io.github.securitycrypto.cipher.AesGcmCipher
import io.github.securitycrypto.key.SecretKeyGenerator
fun exampleEncrypt() {
val key = SecretKeyGenerator.generateAesKey(256)
val cipher = AesGcmCipher(key)
val plaintext = "Sensitive data".encodeToByteArray()
val encrypted = cipher.encrypt(plaintext)
println("Размер зашифрованных данных: ${encrypted.size} байт")
// Вывод: Размер зашифрованных данных: 45 байт (12 nonce + 17 ciphertext + 16 tag)
}
4.3. AesGcmCipher.decrypt()
Что делает: Дешифрует данные, зашифрованные методом encrypt(). Если данные были повреждены или ключ неверен, выбрасывается исключение AEADBadTagException.
import io.github.securitycrypto.cipher.AesGcmCipher
import io.github.securitycrypto.key.SecretKeyGenerator
fun exampleDecrypt() {
val key = SecretKeyGenerator.generateAesKey(256)
val cipher = AesGcmCipher(key)
val original = "Hello, world!".encodeToByteArray()
val encrypted = cipher.encrypt(original)
// Успешное дешифрование
val decrypted = cipher.decrypt(encrypted)
println("Расшифровано: ${decrypted.decodeToString()}") // Hello, world!
// Попытка дешифрования с измененными данными
val tampered = encrypted.copyOf()
tampered[0] = tampered[0].xor(1) // Повреждаем первый байт
try {
cipher.decrypt(tampered)
} catch (e: AEADBadTagException) {
println("❌ Обнаружено повреждение данных: ${e.message}")
}
}
4.4. RsaKeyPairGenerator.generateKeyPair()
Что делает: Генерирует асимметричную пару ключей RSA (публичный и приватный) заданного размера. Рекомендуемый размер — 2048 или 4096 бит.
import io.github.securitycrypto.key.RsaKeyPairGenerator
import java.security.KeyPair
fun exampleRsaKeyPair() {
val keyPair: KeyPair = RsaKeyPairGenerator.generateKeyPair(2048)
val publicKey = keyPair.public
val privateKey = keyPair.private
println("Публичный ключ: ${publicKey.encoded}")
println("Приватный ключ: ${privateKey.encoded}")
println("Алгоритм: ${publicKey.algorithm}") // RSA
}
4.5. RsaOaepCipher.encrypt()
Что делает: Шифрует данные с использованием алгоритма RSA-OAEP (Optimal Asymmetric Encryption Padding). Используется для шифрования небольших объемов данных (до 190 байт для ключа 2048 бит).
import io.github.securitycrypto.cipher.RsaOaepCipher
import io.github.securitycrypto.key.RsaKeyPairGenerator
fun exampleRsaEncrypt() {
val keyPair = RsaKeyPairGenerator.generateKeyPair(2048)
val cipher = RsaOaepCipher()
val plaintext = "Secret message for RSA".encodeToByteArray()
val encrypted = cipher.encrypt(plaintext, keyPair.public)
println("Зашифровано RSA: ${encrypted.size} байт") // 256 байт для ключа 2048 бит
}
4.6. RsaOaepCipher.decrypt()
Что делает: Дешифрует данные, зашифрованные с помощью RSA-OAEP, используя приватный ключ.
import io.github.securitycrypto.cipher.RsaOaepCipher
import io.github.securitycrypto.key.RsaKeyPairGenerator
fun exampleRsaDecrypt() {
val keyPair = RsaKeyPairGenerator.generateKeyPair(2048)
val cipher = RsaOaepCipher()
val original = "RSA works!".encodeToByteArray()
val encrypted = cipher.encrypt(original, keyPair.public)
val decrypted = cipher.decrypt(encrypted, keyPair.private)
println("Расшифровано RSA: ${decrypted.decodeToString()}") // RSA works!
}