ONNX Runtime Web предоставляет возможность запускать модели машинного обучения в браузере на стороне клиента. При этом возникает риск несанкционированного доступа к самой модели, её весам и архитектуре. Для уменьшения вероятности извлечения и реверс-инжиниринга применяются несколько подходов, сочетающих шифрование, обфускацию и стратегию разбиения модели.
Модели ONNX хранятся в формате .onnx, который является
бинарным и открытым. Любой файл .onnx, переданный клиенту,
потенциально может быть скачан и проанализирован. Для защиты применяются
следующие методы:
Шифрование модели перед доставкой: модель
сохраняется на сервере в зашифрованном виде (AES-256). На клиенте
используется JavaScript-код для дешифровки перед инициализацией
InferenceSession. Важным моментом является хранение ключа
шифрования — его нельзя хранить в открытом виде в коде, поэтому
используется серверный сервис для временной выдачи ключей с ограничением
по времени действия.
Разделение модели на части: модель может быть разбита на несколько фрагментов и доставляться постепенно. Это усложняет попытку полного скачивания файла, так как отдельные части без правильного порядка или ключа дешифровки бесполезны.
Для работы с зашифрованной моделью используется потоковое считывание и расшифровка:
import * as ort from 'onnxruntime-web';
async function loadEncryptedModel(url, decryptKey) {
const response = await fetch(url);
const encryptedBuffer = await response.arrayBuffer();
const decryptedBuffer = decryptModel(encryptedBuffer, decryptKey);
const session = await ort.InferenceSession.create(decryptedBuffer);
return session;
}
function decryptModel(buffer, key) {
// AES-256 дешифровка
// Реализовать с использованием SubtleCrypto
const cryptoKey = crypto.subtle.importKey(
'raw', key, { name: 'AES-CBC' }, false, ['decrypt']
);
return crypto.subtle.decrypt({ name: 'AES-CBC', iv: buffer.slice(0,16) }, cryptoKey, buffer.slice(16));
}
Важный момент: инициализация модели в браузере возможна только после успешной расшифровки. Без ключа модель останется недоступной.
ONNX Runtime Web предоставляет API InferenceSession,
через которое осуществляется вычисление. Для защиты модели
применяются:
session.run() и обработку входных данных. Это затрудняет
анализ алгоритма работы с моделью.Для дополнительной защиты создаются механизмы:
Для особо чувствительных моделей целесообразно переносить часть вычислений на сервер:
.onnx: веса могут храниться в зашифрованной форме
и дешифроваться на лету в памяти клиента..onnx хранит
информацию о слое, типе тензоров и атрибутах. Их удаление или замена на
абстрактные имена затрудняет восстановление архитектуры.Эта стратегия позволяет снизить риск извлечения модели и затрудняет реверс-инжиниринг при использовании ONNX Runtime Web в браузере.