Backup: сократить копирование буферов импорта и экспорта без смены формата

Abierto
#394 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
5/5
Tiempo estimado
Más de una semana
Aptitud para principiantes
38/100
Tipo de issue
Refactorización
Claridad
Bastante claro
Estado de actividad
Activo
Stack tecnológico
csharp
Área
backend, security

Línea de trabajo

Start with SettingsViewModel.OpenBackup and BackupArchive.Decrypt, then trace the export serialization and existing tests related to #334. Check the current archive format, size limits, authentication behavior, and storage handling before changing buffer ownership. Done means preserving v1 compatibility and safe export guarantees, passing the specified boundary and failure tests, and confirming lower allocations with a repeatable isolated benchmark.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Проблема

SettingsViewModel.OpenBackup загружает файл в растущий MemoryStream, затем делает ToArray(). BackupArchive.Decrypt дополнительно выделяет plaintext размером с payload. Экспорт сначала создаёт полный JSON-массив, затем отдельный массив результата. Лимит экспорта проверяется только после полной сериализации.

Измерения

Windows x64, .NET 10.0.7 Release, без tiered compilation; два прогрева, медиана семи повторов. Синтетический набор: 200 профилей с отдельными конфигурациями по 128 КиБ, JSON около 25,1 МиБ.

  • Чтение в памяти + текущая расшифровка: 100,58 мс, 164,58 МиБ аллокаций.
  • C#-прототип с заранее выделенным буфером, без ToArray() и с расшифровкой на месте: 83,93 мс, 75,47 МиБ.
  • Текущий экспорт: 83,58 мс, 113,78 МиБ.
  • Сериализация в поток с последующим шифрованием на месте: 83,41 мс, 65,84 МиБ.
  • Отказ текущего экспорта для набора с примерно 38 МиБ исходных конфигураций всё равно выделяет около 165 МиБ.

Аллокации суммарные, не пик RAM. Реальный диск, Avalonia storage providers, получение секретов и полное восстановление не измерялись. Прототипы совместимы с текущим форматом; выигрыш по времени для небольших наборов не установлен.

Решение

Оптимизировать буферы в C#, сохранив формат v1, лимит 32 МиБ, AES-GCM, PBKDF2, AAD и обработку ошибок. При достоверно известной длине заранее выделять буфер после проверки лимита; для потока неизвестной длины использовать ограниченное накопление. Исключить ToArray() перед расшифровкой, рассмотреть шифрование/расшифровку на месте в буфере с эксклюзивным владением. Ограничивать сериализацию в процессе записи, до неограниченного роста результата.

Готово, когда

  • Старые архивы читаются, новые читаются прежней реализацией; заголовок, версии и криптографические параметры совместимы.
  • Тесты проверяют неверный пароль, повреждение, усечение, точную границу размера и превышение лимита для потоков с известной и неизвестной длиной.
  • Plaintext не выдаётся вызывающему коду до успешной аутентификации и не пишется во временные файлы; принадлежащие компоненту временные секретные буферы очищаются на ошибках.
  • Сохраняются гарантии безопасного экспорта, исправленные в #334; особенности IStorageFile не обходятся предположением о локальном пути.
  • Повторяемый изолированный бенчмарк подтверждает снижение аллокаций; измерения отделены от пика RAM и дискового I/O.

Связано с #18 и #334. Смена языка, новый блочный формат, сжатие и ослабление KDF не входят в задачу. Все проверки — BYDLO_SAFE_DEV=1, фейки, без движков и изменения сети.

Lenguaje dominante
C#
Estrellas
5
Forks
1
Merge medio
30 min
PR fusionados (30 d)
171

Preparar el entorno

Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de endercodezz/BYDLO

Todos los issues de endercodezz/BYDLO

Issues similares

Más issues de C#

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.