Как это устроено
Данные и шифрование
Что хранит Nuvo, где, как это шифруется, как выводятся ключи и как создаются копии перед миграциями.
Что хранится
Медиатека лежит в одной базе данных SQLCipher, library.db. В ней:
- треки и снимки их метаданных,
- любимые треки, сохранённые альбомы и исполнители,
- плейлисты, их элементы и обложки плейлистов,
- события воспроизведения и состояние «сейчас играет»,
- кэш текстов и ваши собственные тексты,
- данные рекомендаций: модель вкуса, скрытое, граф кандидатов, стартовые исполнители,
- импорты и их строки,
- локальные папки с музыкой и файлы, очередь сохранения файлами,
- настройки и оформление,
- история распознавания и очередь Last.fm.
Ключи
Элемент хранилища ключей (сервис nuvo-core, элемент master-key) содержит мастер-ключ: 32 случайных байта. Мастер-ключ и фраза восстановления из 24 слов (BIP39) преобразуются друг в друга в обе стороны: фраза - это мастер-ключ, записанный словами. Из мастер-ключа через HKDF-SHA256 выводятся два подключа: ключ базы данных (строка info nuvo/db/v1) и ключ аудио (строка info nuvo/audio/v1).
- При первом запуске демон создаёт 32-байтный мастер-ключ и кладёт его в хранилище ключей Secret Service.
- Подключи выводятся из мастер-ключа через HKDF-SHA256. Строки
infoсодержат версию, поэтому новая схема может жить рядом со старыми данными. - Ключ базы данных открывает SQLCipher в режиме raw key. Ключ аудио запечатывает кэшированное аудио.
- Фраза восстановления - это мастер-ключ, записанный как 24 слова BIP39. Nuvo показывает её один раз, пока вы не подтвердите, что записали её. После этого маршрут возвращает
404.
Заблокированное состояние
Если library.db существует, а в хранилище ключей нет ключа или ключ её не открывает, демон стартует заблокированным. Существующую базу он никогда не заменяет. Введите 24 слова, и он разблокируется. Фраза, которая не открывает медиатеку, отклоняется.
Миграции и копии
У базы данных есть версия схемы. Перед миграцией существующей медиатеки демон копирует library.db в backups/library-<time>-v<version>.db и хранит три последние копии. База, записанная более новым Nuvo, отклоняется, а не изменяется.
Поиск
Фильтры приводят текст к нижнему регистру в любой письменности с помощью функции внутри базы данных. Ключи сортировки и поиска для локальных файлов хранятся, поэтому вывод 20 000 файлов не пересчитывает их заново.
Что не шифруется
Собственное браузерное хранилище окна (профиль Electron) содержит состояние интерфейса. База данных содержит вашу медиатеку и настройки. Локальные музыкальные файлы остаются как есть.