Безопасность и конфиденциальность: доступ к локальным файлам、маскировка API、официальные интерфейсы
Ваша текущая проблема
При использовании сторонних инструментов, что вас больше всего беспокоит?
- "Он будет читать мой API Key?"
- "Будет ли моя информация аутентификации загружена на сервер?"
- "Будет ли риск утечки данных?"
- "Что делать, если он изменит мои конфигурационные файлы?"
Эти вопросы разумны, особенно при работе с конфиденциальной информацией аутентификации AI платформы. Это руководство подробно объяснит, как opencode-mystatus защищает ваши данные и конфиденциальность через дизайн.
Принцип локального приоритета
opencode-mystatus следует принципу «только чтение локальных файлов + прямой запрос официальных API», все конфиденциальные операции выполняются на вашем компьютере, без прохождения через какие-либо сторонние серверы.
Основная идея
Дизайн безопасности плагина окружает три основных принципа:
- Принцип только чтения: только чтение локальных файлов аутентификации, без записи или изменения чего-либо
- Официальные интерфейсы: только вызов официальных API каждой платформы, без использования сторонних сервисов
- Маскировка данных: автоматическое скрытие конфиденциальной информации (например, API Key) при отображении вывода
Эти три принципа наслаиваются слой за слоем, обеспечивая безопасность ваших данных от чтения до отображения во всём процессе.
Доступ к локальным файлам (только чтение)
Какие файлы читает плагин
Плагин только читает два локальных конфигурационных файла, и все они в режиме только чтения:
| Путь к файлу | Назначение | Местоположение исходного кода |
|---|---|---|
~/.local/share/opencode/auth.json | Официальное хранилище аутентификации OpenCode | mystatus.ts:35 |
~/.config/opencode/antigravity-accounts.json | Хранилище учётных записей плагина Antigravity | google.ts (логика чтения) |
Не изменять файлы
В исходном коде используется только функция readFile для чтения файлов, без каких-либо операций writeFile или других изменений. Это означает, что плагин не случайно перезапишет вашу конфигурацию.
Доказательства исходного кода
// mystatus.ts строки 38-40
const content = await readFile(authPath, "utf-8");
authData = JSON.parse(content);Здесь используется fs/promises.readFile из Node.js, это операция только для чтения. Если файл не существует или формат неверен, плагин вернёт дружественное сообщение об ошибке, вместо того чтобы создавать или изменять файл.
Автоматическая маскировка API Key
Что такое маскировка
Маскировка (Masking) означает, что при отображении конфиденциальной информации отображаются только некоторые символы, скрывая ключевую часть.
Например, ваш API Key 智谱 AI может быть:
sk-9c89abc1234567890abcdefAQVMПосле маскировки отображается:
sk-9c8****fAQVMПравила маскировки
Плагин использует функцию maskString для обработки всей конфиденциальной информации:
// utils.ts строки 130-135
export function maskString(str: string, showChars: number = 4): string {
if (str.length <= showChars * 2) {
return str;
}
return `${str.slice(0, showChars)}****${str.slice(-showChars)}`;
}Описание правил:
- По умолчанию отображаются первые 4 и последние 4 символа
- Средняя часть заменена на
**** - Если строка слишком короткая (≤ 8 символов), возвращается как есть
Пример фактического использования
В запросе квоты 智谱 AI, маскированный API Key появится в выводе:
// zhipu.ts строка 124
const maskedKey = maskString(apiKey);
lines.push(`${t.account} ${maskedKey} (${accountLabel})`);Эффект вывода:
Account: 9c89****AQVM (Coding Plan)Роль маскировки
Даже если вы делитесь скриншотом результата запроса с другими людьми, это не раскроет ваш настоящий API Key. Только отображаемые «первые и последние 4 символа» видны, ключевая часть скрыта.
Вызов официальных интерфейсов
Какие API вызывает плагин
Плагин вызывает только официальные API каждой платформы, без прохождения через какие-либо сторонние серверы:
| Платформа | Конечная точка API | Назначение |
|---|---|---|
| OpenAI | https://chatgpt.com/backend-api/wham/usage | Запрос квоты |
| 智谱 AI | https://bigmodel.cn/api/monitor/usage/quota/limit | Запрос лимита Token |
| Z.ai | https://api.z.ai/api/monitor/usage/quota/limit | Запрос лимита Token |
| GitHub Copilot | https://api.github.com/copilot_internal/user | Запрос квоты |
| GitHub Copilot | https://api.github.com/users/{username}/settings/billing/premium_request/usage | Запрос публичного API |
| Google Cloud | https://oauth2.googleapis.com/token | Обновление OAuth Token |
| Google Cloud | https://cloudcode-pa.googleapis.com/v1internal:fetchAvailableModels | Запрос квоты модели |
Безопасность официальных API
Эти конечные точки API являются официальными интерфейсами каждой платформы, использующими шифрование передачи HTTPS. Плагин просто отправляет запросы как «клиент», не хранит и не пересылает какие-либо данные.
Защита от тайм-аута запроса
Чтобы предотвратить зависание сетевого запроса, плагин устанавливает тайм-аут в 10 секунд:
// types.ts строка 114
export const REQUEST_TIMEOUT_MS = 10000;
// utils.ts строки 84-106
export async function fetchWithTimeout(
url: string,
options: RequestInit,
timeoutMs: number = REQUEST_TIMEOUT_MS,
): Promise<Response> {
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
try {
const response = await fetch(url, {
...options,
signal: controller.signal,
});
return response;
} catch (err) {
if (err instanceof Error && err.name === "AbortError") {
throw new Error(t.timeoutError(Math.round(timeoutMs / 1000)));
}
throw err;
} finally {
clearTimeout(timeoutId);
}
}Роль механизма тайм-аута:
- Предотвращает зависание плагина из-за сетевого сбоя
- Защищает ваши системные ресурсы от занятия
- Через 10 секунд тайм-аут автоматически отменяет запрос и возвращает сообщение об ошибке
Итог по защите конфиденциальности
Что плагин не будет делать
| Операция | Поведение плагина |
|---|---|
| Хранение данных | ❌ Не хранит какие-либо данные пользователя |
| Загрузка данных | ❌ Не загружает какие-либо данные на сторонний сервер |
| Кэширование результатов | ❌ Не кэширует результаты запросов |
| Изменение файлов | ❌ Не изменяет какие-либо локальные конфигурационные файлы |
| Запись журналов | ❌ Не записывает какие-либо журналы использования |
Что плагин будет делать
| Операция | Поведение плагина |
|---|---|
| Чтение файлов | ✅ Только чтение локальных файлов аутентификации |
| Вызов API | ✅ Только вызов официальных конечных точек API |
| Маскированное отображение | ✅ Автоматическое скрытие конфиденциальной информации, такой как API Key |
| Открытый аудит | ✅ Исходный код полностью открыт, можно самостоятельно аудировать |
Аудит исходного кода
Весь код плагина открыт, вы можете:
- Просмотреть репозиторий исходного кода GitHub
- Проверить каждую вызванную конечную точку API
- Проверить, есть ли логика хранения данных
- Подтвердить способ реализации функции маскировки
Часто задаваемые вопросы
Плагин украдёт мой API Key?
Нет. Плагин только использует API Key для отправки запросов на официальный API, не хранит и не пересылает на какие-либо сторонние серверы. Весь код открыт, вы можете проверить.
Почему отображается маскированный API Key?
Это для защиты вашей конфиденциальности. Даже если вы делитесь скриншотом результата запроса, это не раскроет полный API Key. После маскировки отображаются только первые 4 и последние 4 символа, средняя часть скрыта.
Плагин изменит мои конфигурационные файлы?
Нет. Плагин только использует readFile для чтения файлов, не выполняет какие-либо операции записи. Если формат вашего конфигурационного файла неверен, плагин вернёт сообщение об ошибке, вместо того чтобы пытаться исправить или перезаписать.
Будут ли результаты запроса кэшироваться в плагине?
Нет. Плагин каждый раз при вызове в реальном времени читает файл и запрашивает API, не кэширует какие-либо результаты. После завершения запроса все данные немедленно отбрасываются.
Будет ли плагин собирать данные об использовании?
Нет. Плагин не имеет каких-либо функций отслеживания или сбора данных, не будет отслеживать ваше поведение использования.
Итог урока
- Принцип только чтения: плагин только читает локальные файлы аутентификации, не изменяет какого-либо содержания
- Маскировка API: автоматическое скрытие ключевой части API Key при отображении вывода
- Официальные интерфейсы: только вызов официальных API каждой платформы, без использования сторонних сервисов
- Открытая прозрачность: весь код открыт, можно самостоятельно аудировать механизм безопасности
Предварительный обзор следующего урока
На следующем уроке мы изучим Модели данных: структура файлов аутентификации и форматы ответов API
Вы узнаете:
- Полное определение структуры AuthData
- Значение полей данных аутентификации каждой платформы
- Форматы данных ответов API
Приложение: справочник по исходному коду
Нажмите для просмотра местоположения исходного кода
Время обновления: 2026-01-23
| Функция | Путь к файлу | Номер строки |
|---|---|---|
| Чтение файлов аутентификации | plugin/mystatus.ts | 38-40 |
| Функция маскировки API | plugin/lib/utils.ts | 130-135 |
| Настройка тайм-аута запроса | plugin/lib/types.ts | 114 |
| --- | --- | --- |
| Пример маскировки 智谱 AI | plugin/lib/zhipu.ts | 124 |
Ключевые функции:
maskString(str, showChars = 4):маскированное отображение конфиденциальных строк, отображение первых и последнихshowCharsсимволов, середина заменена на****
Ключевые константы:
REQUEST_TIMEOUT_MS = 10000:время тайм-аута запроса API (10 секунд)