Безопасность: защита весов модели

Keras.js предоставляет возможность запускать предварительно обученные модели Keras непосредственно в браузере с помощью JavaScript. Одним из критически важных аспектов использования моделей в клиентской среде является безопасность и защита весов модели, поскольку они могут содержать интеллектуальную собственность, а также быть уязвимы для несанкционированного доступа и модификации.

Формат хранения весов

Весовые коэффициенты моделей Keras в Keras.js обычно экспортируются в формате JSON, где структура включает:

  • Архитектуру модели (config)
  • Слои и их параметры
  • Тензоры весов в виде массивов чисел с плавающей точкой

Пример структуры JSON для слоя Dense:

{
  "class_name": "Dense",
  "config": {
    "units": 64,
    "activation": "relu",
    "use_bias": true
  },
  "weights": {
    "kernel": [[0.1, 0.2], [0.3, 0.4]],
    "bias": [0.01, 0.02]
  }
}

JSON-файл с весами полностью загружается на клиентскую сторону, что делает его доступным для анализа и копирования при стандартной загрузке.

Риски и угрозы

  1. Копирование модели: любой пользователь может сохранить JSON-файл и использовать веса без лицензии.
  2. Модификация весов: изменение весов может привести к изменению поведения модели и искажению результатов.
  3. Эксплуатация уязвимостей: открытые веса могут использоваться для атак на модель, таких как adversarial attacks или reverse engineering.

Методы защиты весов

1. Шифрование и расшифровка на клиенте

Для защиты весов можно использовать симметричное шифрование (AES) или асимметричное (RSA). Процесс включает:

  1. Шифрование JSON-файла на сервере перед отправкой пользователю.
  2. Расшифровку в браузере перед загрузкой в Keras.js.

Пример AES-шифрования на Node.js:

const crypto = require('crypto');
const algorithm = 'aes-256-cbc';
const key = crypto.randomBytes(32);
const iv = crypto.randomBytes(16);

function encrypt(data) {
  let cipher = crypto.createCipheriv(algorithm, key, iv);
  let encrypted = cipher.update(JSON.stringify(data), 'utf8', 'base64');
  encrypted += cipher.final('base64');
  return { encryptedData: encrypted, iv: iv.toString('base64') };
}

На клиенте необходимо использовать тот же алгоритм и ключ для расшифровки перед загрузкой в Keras.js.

2. Минимизация точности весов

Снижение точности чисел с плавающей точкой (например, с float32 до float16) уменьшает размер файла и делает точное восстановление модели сложнее. Keras.js поддерживает весовые тензоры с пониженной точностью.

3. Обфускация JSON

Использование обфускаторов для структуры JSON усложняет чтение и анализ весов. Можно изменить имена слоев, ключей и даже переставить порядок массивов, сохраняя корректность модели для Keras.js.

4. Серверное вычисление чувствительных операций

Если часть модели содержит критически важные слои, можно оставить их выполнение на сервере через REST API, а на клиенте загружать только промежуточные вычисления. Такой подход позволяет скрыть стратегически важные веса и алгоритмы.

Загрузка и инициализация модели с защищёнными весами

После расшифровки или обфускации JSON можно использовать Keras.js для создания модели:

import KerasJS from 'keras-js';

const model = new KerasJS.Model({
  filepaths: {
    model: 'model.json',
    weights: 'weights.bin'
  },
  gpu: true
});

await model.ready();
const inputData = new Float32Array([0.5, 0.2, 0.1, 0.7]);
const outputData = await model.predict({ input: inputData });
console.log(outputData);

При использовании шифрования необходимо вставить этап расшифровки JSON/weights до передачи их Keras.js.

Контроль доступа

Для ограничения несанкционированного использования весов рекомендуется:

  • Использовать авторизацию API при загрузке модели с сервера.
  • Ограничивать количество загрузок и проверять домен, с которого происходит запрос.
  • Внедрять временные токены для расшифровки, которые истекают через короткое время.

Практические рекомендации

  • Всегда хранить оригинальные веса на сервере. Клиентская версия — лишь копия для inference.
  • Комбинировать методы защиты: шифрование + обфускация + контроль доступа.
  • Минимизировать критические слои на клиенте, если возможен серверный расчет.
  • Регулярно обновлять ключи шифрования и токены доступа для снижения риска компрометации.

Защита весов модели в Keras.js требует баланса между удобством работы в браузере и безопасностью интеллектуальной собственности. Комбинация шифрования, контроля доступа и обфускации позволяет существенно усложнить несанкционированное использование модели без снижения производительности инференса.