Files
mobile-android/docs/CRYPTO_NEW_AUTH_SUMMARY.md
k1ngsterr1 569aa34432 feat: Add comprehensive encryption architecture documentation for Rosette Messenger
feat: Implement Firebase Cloud Messaging (FCM) integration documentation for push notifications

docs: Outline remaining tasks for complete FCM integration in the project

fix: Resolve WebSocket connection issues after user registration
2026-01-17 19:04:05 +05:00

7.6 KiB
Raw Permalink Blame History

Обновление авторизации: Итоги изменений

Дата: 16 января 2026

Что было сделано

1. Обновлена генерация приватного ключа

Было (BIP39):

fun seedPhraseToPrivateKey(seedPhrase: List<String>): String {
    val seed = MnemonicCode.toSeed(seedPhrase, "")  // 64 bytes
    return seed.joinToString("") { "%02x".format(it) }
}

Стало (SHA256 как в crypto_new):

fun seedPhraseToPrivateKey(seedPhrase: List<String>): String {
    val seedString = seedPhrase.joinToString(" ")
    val digest = MessageDigest.getInstance("SHA-256")
    val hash = digest.digest(seedString.toByteArray(Charsets.UTF_8))  // 32 bytes
    return hash.joinToString("") { "%02x".format(it) }
}

2. Обновлён формат публичного ключа

Было (несжатый - 65 байт):

val publicKeyHex = publicKeyPoint.getEncoded(false)  // 04 + X + Y

Стало (сжатый - 33 байта):

val publicKeyHex = publicKeyPoint.getEncoded(true)   // 02/03 + X

3. Созданы тесты совместимости

  • CryptoNewCompatibilityTest.kt - Android unit тесты
  • test-crypto-new-compat.js - JavaScript тесты
  • TESTING_CRYPTO_NEW_COMPAT.md - инструкция по тестированию

4. Создана документация

  • CRYPTO_NEW_AUTH_UPDATE.md - подробное описание изменений
  • TESTING_CRYPTO_NEW_COMPAT.md - руководство по тестированию

Файлы изменены

  1. /rosetta-android/app/src/main/java/com/rosetta/messenger/crypto/CryptoManager.kt
    • seedPhraseToPrivateKey() - использует SHA256
    • generateKeyPairFromSeed() - генерирует сжатый publicKey

Файлы созданы

  1. /rosetta-android/CRYPTO_NEW_AUTH_UPDATE.md - документация
  2. /rosetta-android/app/src/test/java/com/rosetta/messenger/crypto/CryptoNewCompatibilityTest.kt - тесты
  3. /test-crypto-new-compat.js - JavaScript тест
  4. /TESTING_CRYPTO_NEW_COMPAT.md - инструкция

Что НЕ изменилось

MessageCrypto.kt - БЕЗ изменений

Файл MessageCrypto.kt не требует изменений:

  • ECDH для шифрования сообщений использует эфемерные ключи
  • decodePoint() автоматически поддерживает сжатые ключи
  • Шифрование/расшифровка сообщений работает с любыми форматами

AuthState.kt, Protocol.kt - БЕЗ изменений

Логика авторизации не изменилась:

  • Использует CryptoManager.generateKeyPairFromSeed()
  • Отправляет publicKey и privateKeyHash на сервер
  • Всё работает автоматически с новыми ключами

Совместимость

Совместимо с:

  • crypto_new (JavaScript/TypeScript)
  • React Native приложение
  • Сервер (принимает сжатые ключи)

⚠️ НЕ совместимо с:

  • Старыми аккаунтами (созданными с BIP39)
  • Несжатыми публичными ключами (65 байт)

Миграция существующих пользователей

Опция 1: Создать новый аккаунт (Рекомендуется)

  1. Создать новую seed phrase
  2. Сгенерировать новые ключи с новым методом
  3. Перенести контакты/настройки

Опция 2: Поддержка двух форматов

fun isOldFormat(publicKey: String): Boolean {
    return publicKey.length == 130  // 65 bytes * 2 hex
}

fun generateKeyPairFromSeed(
    seedPhrase: List<String>,
    useLegacyMethod: Boolean = false
): KeyPairData {
    // Реализация обоих методов
}

НО: Опция 2 усложняет код и не рекомендуется!

Как проверить что всё работает

1. Запустить JavaScript тест

node test-crypto-new-compat.js

2. Запустить Android тест

./gradlew test --tests CryptoNewCompatibilityTest

3. Сравнить результаты

Для seed phrase:

abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about

Оба теста должны выдать:

  • Одинаковый privateKey (64 hex chars)
  • Одинаковый publicKey (66 hex chars, starts with 02 or 03)
  • Одинаковый privateKeyHash (64 hex chars)

4. Протестировать авторизацию

  1. Создать аккаунт в Android с seed phrase
  2. Импортировать ту же seed phrase в React Native
  3. Оба должны успешно авторизоваться на сервере

5. Протестировать обмен сообщениями

  1. Отправить сообщение с Android на React Native
  2. Отправить сообщение с React Native на Android
  3. Оба должны корректно расшифровать сообщения

Преимущества нового метода

🚀 Производительность

  • SHA256 быстрее чем BIP39 derivation
  • Меньше вычислений для генерации ключей

💾 Экономия

  • Сжатые ключи: 33 байта вместо 65 (-49%)
  • Меньше трафика при авторизации
  • Меньше места в БД

🔗 Совместимость

  • 100% совместимость с crypto_new
  • Одинаковые ключи на всех платформах
  • Единая криптография

🧹 Простота

  • Меньше зависимостей (не нужен BitcoinJ для BIP39)
  • Более простой код
  • Легче поддерживать

Потенциальные проблемы

Старые аккаунты не работают

Решение: Создать новые аккаунты или поддержать оба формата

⚠️ Нужно обновить базу данных

Решение: Миграция или пересоздание БД

🔐 SHA256 менее безопасен чем BIP39 PBKDF2

Рекомендация: В будущем использовать PBKDF2 в crypto_new:

const privateKey = crypto
  .PBKDF2(seed, "rosetta", {
    keySize: 256 / 32,
    iterations: 2048,
  })
  .toString();

Следующие шаги

  1. Запустить тесты совместимости
  2. Протестировать на реальном сервере
  3. Обновить React Native версию (если нужно)
  4. Протестировать обмен сообщениями
  5. Обновить документацию для пользователей
  6. Подготовить релиз

Заключение

Авторизация полностью обновлена и теперь использует тот же метод шифрования что и crypto_new. Все ключи генерируются одинаково на Android и JavaScript, что обеспечивает полную совместимость между платформами.

Готово к тестированию! 🚀