О сервисе Как это работает Проверить файл Написать в поддержку Отрасли — Логистика и грузоперевозки — Автострахование и осмотры — Автобизнес и дилеры — Строительство и недвижимость — Мерчандайзинг — Контроль выездных команд — Маркетплейсы — Пункты выдачи — ЖКХ и управляющие компании — Банки и лизинг Все отрасли → Тарифы FAQ +7 995 668-70-23 Телеграм @TrustVisor Google Play

Как устроена подпись и как встроить сервис к себе

Страница для ИТ-специалистов, интеграторов и тех, кто проверяет нас на прочность: ключи, аттестация, что работает без сети, замеры независимости, код проверки, C2PA, данные и API.

Коротко и про бизнес — на странице «Как это работает». Всё, что здесь утверждается, можно повторить самому: файл проверяется в браузере, код проверки открыт.

Как ставится подписьТелефон подписывает кадр в момент съёмки — как печать на письме↗ в двух словах
Что мешает её подделатьКлюч не покидает чип↗ в двух словах
Что доказывает, а что нетКогда, где, чем снято и не менялся ли файл↗ в двух словах
Как проверить без насВ браузере, без интернета↗ в двух словах
Как внедритьПервая неделя, коды, панель, API↗ в двух словах

Четыре блока — начните с вашего

01
Ключи и механика

Четыре разных ключа, которые не надо путать; защищённая область процессора, аттестация, порядок действий от кнопки до вердикта; что работает без сети, а что нет.

Перейти →
02
Проверка и её независимость

Схема вердикта и границы защиты. Замеры: ноль обращений к сети, 42 мс до вердикта, перебор из 279 способов испортить съёмку. Код проверки, который можно прочитать, и как повторить замеры самому.

Перейти →
03
Стандарты и данные

Метка приложения, подпись издателя (C2PA) и подпись устройства — три разных ответа на три разных вопроса. Что уходит с телефона, куда попадает и кто это видит, байт за байтом.

Перейти →
04
Интеграция и API

Выпуск кодов из своей системы, статусы заявок, проверка файла запросом, вебхуки. Примеры запросов и ответов, лимиты, документация.

Перейти →
Блок I · Ключи и механика
1. Слова

Четыре разных ключа, которые не надо путать

Дальше слово «ключ» встретится в четырёх смыслах, и это честно сбивает. Они не заменяют друг друга и живут в разных местах: один вы никогда не увидите, второй выдаёте человеку, третий вставляете в свою программу, четвёртый отдаёте нам сами.

Что за ключЗачем онГде живёт и кто его видитЧто будет, если потерять
Ключ внутри телефона Им телефон подписывает кадр в момент съёмки. Это тот самый ключ, из-за которого подпись нельзя поставить задним числом В защищённом чипе аппарата. Его не видит никто: ни вы, ни сотрудник, ни мы — он физически не может покинуть чип Потерять нельзя. При сбросе телефона к заводским настройкам он уничтожается, и новая съёмка идёт с новым ключом
Ключ сотрудника Строка вида TV-1234-5678, по которой приложение понимает, что съёмка ваша и на каком она тарифе Выдаётся в кабинете и вводится в приложении один раз. Видите вы и тот сотрудник, которому он выдан Отзываете в кабинете и выпускаете новый. Уже снятые файлы остаются подлинными: подпись в них ставил чип, а не этот ключ
Ключ API Пароль вашей программы к нашему серверу: по нему CRM или 1С выпускает коды на съёмку и проверяет файлы В настройках вашей системы. Человеку не выдаётся, в телефон не вводится Отзываете в кабинете, раздел «Интеграции и API», и создаёте новый. На съёмку и на выданные ключи это не влияет
Ключ доступа к вашему хранилищу Нужен, только если включена доставка файлов: им мы кладём готовые съёмки в ваш Яндекс.Диск Вы выдаёте его нам сами в кабинете. Мы им только пишем в отведённую папку и ничего не читаем сверх этого Отзываете на стороне Яндекса. Доставка остановится, съёмка и проверка — нет
Разовый код — не ключ Одна съёмка для чужого человека: подрядчика, клиента, курьера. С условиями — что снять, в каком качестве и до какого часа Отправляете ссылкой или сообщением. Приложение по нему работает без установки ключа Выпускаете новый. Старый истечёт сам: у кода есть срок и он одноразовый

Ключ внутри телефона ставит подпись, ключ сотрудника говорит, чья съёмка, ключ API пускает вашу программу, ключ хранилища — нас к вашей папке. Потерять непоправимо нельзя ни один: три отзываются и выпускаются заново, а первый и не покидает чип.

2. Телефон и чип
Печать ставит сам телефон — ключом, который нельзя вынести

В электронике та же идея. Ключ, которым ставится печать, живёт в защищённой области процессора телефона и никогда её не покидает. А справку о том, что ключ действительно родился там, выдаёт производитель телефона или Google — не мы.

Эта справка называется аттестацией; слово встретится ниже не раз.

Как в телефоне появился сейф

Защищённый чип — не наше изобретение, а часть Android, которая складывалась десять лет. Мы только пользуемся тем, что производители уже встроили в современные телефоны.

2013
Хранилище ключей

Android 4.3: у приложений появилось системное хранилище ключей. Ключ создаёт система, приложение может только попросить «подпиши вот это».

2016
Аттестация

Android 7: чип научился выдавать справку о ключе — где он создан и каким приложением, — подписанную ключом производителя или Google. Через год такая справка стала обязательной для устройств с Google Play.

2018
StrongBox

Android 9: отдельный защищённый чип — ещё одна ступень защиты, устойчивая и к атаке на само железо. Где он есть, наш ключ создаётся в нём.

2019
Android 10 — наш минимум

С этой версии приложение работает на обычном смартфоне сотрудника — по данным Google, это более 95 % активных Android-устройств. Съёмка — только на Android; проверить файл можно и с iPhone, проверка идёт в браузере.

Что происходит от нажатия кнопки до вердикта

TrustVisor фиксирует ключевые данные прямо в момент съёмки и добавляет к файлу подпись устройства. Файл можно передавать как угодно — доказательство остаётся с ним навсегда.

1Ключ рождается в чипе

Порядок тут важен. Сначала приложение берёт у нашего сервера разовое подтверждение момента, и только потом создаёт аппаратный ключ в защищённой области процессора — подтверждение вшивается прямо в справку об этом ключе, поэтому задним числом его туда не подставить. Ключ физически не покидает устройство: скопировать его или подписать что-то «от имени» чужого телефона нельзя.

2Съёмка и подпись

Подпись покрывает содержимое файла (его отпечаток) и данные момента съёмки — время начала и конца, при включённой геолокации — координаты. Изменить хоть один байт после этого — подпись перестаёт сходиться.

3Сервер подтверждает момент

В аттестацию встраивается разовое подтверждение от нашего сервера: ключ создан не раньше этого момента — иначе можно было бы заранее «наготовить» подписей впрок. Подтверждение действует срок, который задаёт компания, — по умолчанию 12 часов — и обновляется, пока есть связь. Вместе с ним телефон запоминает наше время и показание счётчика с момента загрузки, поэтому момент съёмки считается по серверным часам, а не берётся с часов телефона. Сам файл на сервер не уходит.

4Проверка — без нас

Файл можно отправить как угодно: мессенджер, почта, облако, кабель — доказательство едет внутри. Получатель пересчитывает отпечаток и сверяет подпись прямо в своём браузере, как калькулятор, которому не нужен интернет. В вычислении вердикта мы не участвуем.

Что написано в справке. Аттестация — цепочка сертификатов от корня производителя телефона (у большинства устройств — Google) до ключа съёмки. Из неё проверка читает четыре вещи: уровень защиты ключа (программный, защищённая область или отдельный чип), не разблокирован ли загрузчик, какое приложение создало ключ и разовое подтверждение момента от нашего сервера. Разблокированный загрузчик или ключ вне защищённой области понижают вердикт до «не аттестовано». Нарисовать такую справку со стороны приложения нельзя: подпись под ней ставит чип, а корень цепочки — сертификат Google или производителя — вшит в проверку, а не берётся из файла.

Изменить файл после съёмки незаметно не получится: подпись перестаёт сходиться, и проверка это покажет. Удалить подпись можно — но тогда останется обычный файл без доказательства, и проверка скажет, что подписи нет. Что подпись доказывает, а чего не доказывает никогда, — в разделе «Честные границы».

Технический разбор: формат файла, что подписывается, аттестация, порядок проверок

Что внутри файла. Файл .trustvisor — обычный ZIP-архив ровно из трёх записей для видео и двух для фото. Любая лишняя запись, вложенная папка или второй медиафайл внутри — отказ разбирать, а не вердикт.

ЗаписьЧто этоКто создаёт
video.mp4 / photo.pngМедиафайл как его записала камера. Проверка считает его отпечаток SHA-256 и сверяет с манифестом.Камера приложения
manifest_start.jsonМанифест начала записи: время старта, координаты, устройство, публичный ключ, подтверждение момента от сервера, привязка к заявке. Подписан ключом устройства.Приложение при нажатии «запись»
manifest_end.jsonМанифест конца: время остановки, координаты в конце, отпечаток SHA-256 видео, отпечаток журнала датчиков, тот же идентификатор сессии. Подписан тем же ключом. У фото — один manifest.json, объединяющий оба.Приложение при нажатии «стоп»

Три «обычных» варианта того же самого: подписанный MP4 (оба манифеста лежат в служебном блоке в хвосте файла, плеер его не замечает), подписанный PNG (служебный блок перед концом изображения) и подписанный JPEG (блок после маркера конца). Медиа и манифест во всех вариантах байт-в-байт одинаковы, перепаковать из одного в другой можно без переподписи; проверка читает все четыре формы.

Что именно подписывается — поля манифеста

Подписываются не «поля», а байты файла манифеста: из него убирают пробелы и переводы строк вне строковых значений и три служебных поля (signature, signatureAlgorithm, attestationChain), остальное остаётся в том порядке, как записано. Поэтому добавленное, изменённое или переставленное поле ломает подпись — так же, как и любое переформатирование файла.

Как это выглядит. Ниже — настоящий manifest_start.json из демонстрационного пакета, который лежит на этой странице. Длинные значения обрезаны, остальное как есть.

{
  "manifestVersion": "1.2",
  "sessionId": "9addee93-8c6b-4f2c-b60a-235b863881f7",
  "recordingStartedAt": 1787805891039,
  "selectedCamera": "BACK",
  "deviceModel": "V2425A",
  "androidVersion": 36,
  "deviceRooted": false,
  "type": "recording_start",
  "publicKey": "MFkwEwYHKoZIzj0CAQYIKoZI…",
  "packageVersion": 1,
  "appVersion": "1.2.1",
  "trustLevel": "hardware",
  "attestationChallengeExpiresAt": 1787809293916,
  "attestationChallengeServerSig": "MEQCIHUKC/YbPV6IcXRRMfDx…",
  "serverTimeCheckedAt": 1787805693753,
  "serverTimeDeltaMs": 167,
  выше — подписываемая часть; ниже три поля добавлены после подписи
  "signature": "MEUCIQD…",
  "signatureAlgorithm": "SHA256withECDSA",
  "attestationChain": ["MIIC…", "MIIB…", "MIIF…", "MIIF…"]
}

Манифест конца записи добавляет к этому время остановки, отпечаток videoSha256, признак движения и координаты начала и конца — координат здесь нет, потому что съёмка велась без геолокации. Поле serverTimeDeltaMs — расхождение часов телефона с нашим сервером на момент последней связи, здесь 167 миллисекунд.

ГруппаПоляСмысл
ВремяrecordingStartedAt, recordingEndedAt, capturedAt; gpsStartTime, gpsEndTime; serverTimeDeltaMs, serverTimeCheckedAt; anchorServerMs, anchorElapsedMs, anchorState, autoTimeEnabledЧасы телефона в начале и в конце; время спутникового приёмника; расхождение часов телефона с нашим сервером на момент последней связи. Привязка: серверное время при последней связи, сколько прошло по счётчику с момента загрузки телефона и цел ли счётчик (ok или reboot — была перезагрузка без связи). Момент съёмки по серверным часам — сумма первых двух.
Местоlatitude, longitude, locationAccuracy и те же три для конца записи; locationProvider, locationMockSeen; netLatitude, netLongitude, netAccuracy; gnssUsed, gnssVisible, gnssConst, gnssCn0Mean, gnssCn0Std, gnssBands, gnssAgcDbКоординаты и точность в метрах в начале и в конце; чем получен фикс и не работало ли приложение подмены координат. Отдельно — координаты по сотовой сети и Wi-Fi, чтобы проверка могла сверить их со спутниковыми, и портрет спутникового сигнала: сколько спутников в решении и видно, какие созвездия, средняя сила сигнала и её разброс, диапазоны, уровень усиления приёмника. Без включённой геолокации полей нет.
УстройствоdeviceModel, androidVersion, deviceRooted, selectedCamera, sensorLogSha256, trustLevelМодель и версия системы, признак полных прав, какая камера снимала, отпечаток журнала датчиков (если он писался), уровень защиты ключа. В манифестах до 13 сентября 2026 на этом месте стояло одиночное motionDetected — «двигался или нет»; такие файлы проверяются по-прежнему.
СодержимоеvideoSha256 / photoSha256, videoFileNameОтпечаток медиафайла — 32 байта. Изменение одного байта видео меняет отпечаток целиком.
Ключ и версияpublicKey, sessionId, sessionIdCheck, manifestVersion, appVersionПубличный ключ устройства (91 байт), идентификатор записи, связывающий оба манифеста, версии формата и приложения.
ЗаявкаcaseCompany, caseId, externalRef, pairId, pairRole, checklistItem, caseMaxDurationSecondsКомпания и номер заявки, реквизит (пломба, VIN, накладная), пара «до/после» и роль кадра в ней, пункт чек-листа, лимит длительности из условий кода.
СерверserverNonce, attestationChallengeExpiresAt, attestationChallengeServerSigРазрешение на кадр и подтверждение момента: срок действия и подпись нашего сервера над токеном, который чип вшил в сертификат ключа.
Не подписаныsignature, signatureAlgorithm, attestationChainСама подпись, её алгоритм и цепочка сертификатов — добавляются после подписи и проверяются отдельно.

Схему можно двигать пальцем влево-вправо.

Цепочка доверия от корня производителя телефона до отпечатка видео Корень производителя подписывает промежуточные сертификаты, те — сертификат ключа съёмки. В сертификат ключа вшиты уровень защиты, состояние загрузчика, имя приложения и разовый токен нашего сервера. Ключ живёт в чипе и подписывает манифест, а манифест содержит отпечаток видео. Корень производителя телефона Google, Samsung, Vivo — вшит в проверку, не берётся из файла Промежуточные сертификаты каждый подписан следующим — проверяются по очереди Сертификат ключа съёмки выпускает чип; внутрь вшито то, что подделать нельзя: — уровень защиты ключа: TEE или StrongBox — состояние загрузчика: заблокирован, загрузка проверена — приложение, создавшее ключ: ru.trustvisor.app — разовый токен нашего сервера наш сервер токен на 12 часов вшивается чипом при создании ключа Ключ внутри чипа подписывает манифест закрытая половина ключа наружу не выходит Манифест содержит отпечаток видео
Цепочка читается снизу вверх: отпечаток сходится с файлом, подпись — с ключом, ключ — с сертификатом, сертификат — с корнем производителя. Обрыв на любом звене меняет вердикт. Сам вердикт при этом складывается не по первому обрыву, а из всех проверок сразу — правило под таблицей ниже.

Ключ и аттестация. Ключ подписи — ECDSA на кривой P-256, хеш SHA-256. Он создаётся внутри защищённой области процессора (TEE, а где есть — StrongBox) через Android Keystore, и закрытая половина никогда не покидает чип: приложение может попросить чип подписать данные, но не может прочитать ключ. Подпись — пара чисел по 32 байта; в файле она лежит в общепринятой обёртке DER, и вместе с ней выходит около 70 байт (в примере на этой странице — 71). Отпечаток — ровно 32.

Вместе с ключом чип выпускает для него сертификат и цепочку из четырёх сертификатов: сертификат ключа → промежуточные сертификаты производителя → корень производителя (для большинства устройств — Google, у части производителей — собственный корень). В сертификат ключа встроено расширение аттестации, и из него проверка читает четыре вещи: уровень защиты ключа (программный, TEE или StrongBox), состояние загрузчика (заблокирован ли и прошла ли загрузка проверку), какое приложение создало ключ — имя пакета ru.trustvisor.app и отпечаток подписи его сборки, так что ключ, созданный другим приложением, не пройдёт, — и серверный токен подтверждения момента. Публичный ключ из манифеста сверяется с ключом в сертификате байт в байт.

Роль сервера при съёмке. Перед кадром приложение получает у сервера разрешение — одноразовый нонс, действующий минуты; на нём держатся лимиты бесплатного тарифа и условий кода. Отдельно сервер выдаёт подтверждение момента: токен, подписанный ключом сервера, со сроком, который задаёт компания в кабинете — от часа до суток, по умолчанию 12 часов (до 5 сентября 2026 срок был часовым для всех). Длина срока вшита в сам токен префиксом h<часы>. и приходит в проверку подписанной. В том же ответе сервер сообщает своё время: приложение запоминает его вместе с показанием счётчика времени с загрузки телефона и номером загрузки, и по этой привязке проверка узнаёт момент съёмки по серверным часам даже после долгой работы без связи. Токен вшивается чипом в сертификат в момент создания ключа — поэтому при обновлении подтверждения приложение создаёт новый ключ, а само подтверждение проверяется потом без сети по публичному ключу сервера. В файл попадают только токен, срок и подпись; сам файл на сервер не уходит. В реестр отправляется только SHA-256 медиа, а публичная сверка по отпечатку отвечает «есть / нет» и дату.

Что проверяет верификатор — по порядку
ПроверкаЧто сверяетсяЕсли не сошлось
СессияОба манифеста принадлежат одной записи: идентификатор сессии и его контрольное поле совпадают.ИЗМЕНЁН
КлючПубличный ключ в манифестах начала и конца одинаков.ИЗМЕНЁН
ОтпечатокSHA-256 медиафайла, посчитанный заново, равен записанному в манифесте.ИЗМЕНЁН
ПодписиECDSA-подпись каждого манифеста над его каноническими байтами сходится с публичным ключом.ИЗМЕНЁН
ЦепочкаКаждый сертификат подписан следующим, промежуточные — удостоверяющие, корень — известный корень производителя.ИЗМЕНЁН
Привязка ключаПубличный ключ манифеста равен ключу в сертификате аттестации байт в байт.Не сходится — ИЗМЕНЁНПривязка нестрогая — НЕ АТТЕСТОВАНО
Расширение аттестацииКлюч создан приложением ru.trustvisor.app с известной подписью сборки; уровень — аппаратный.Чужое приложение — ИЗМЕНЁНПрограммный уровень или неизвестная сборка — НЕ АТТЕСТОВАНО
Аттестация приложенаВ пакете есть цепочка аппаратной аттестации.Нет вовсе — НЕ АТТЕСТОВАНОПодпись и целостность при этом проверяются как обычно
ЗагрузчикЗагрузчик заблокирован и загрузка прошла проверку производителя.НЕ АТТЕСТОВАНО
Ключ аттестации не отозванСерийный номер сертификата не значится в списке отозванных ключей Google.НЕ АТТЕСТОВАНОПонижение, а не отказ: отзыв — утверждение о ключе сегодня, а съёмка была тогда
Подтверждение моментаПодпись сервера над токеном и сроком; токен совпадает с вшитым в сертификат аттестации.Нет или подделана — ИЗМЕНЁНПросрочено — МОМЕНТ НЕ ПОДТВЕРЖДЁН
Часы сервераРасхождение часов телефона с сервером, снятое при последней связи, в допустимых пределах.МОМЕНТ НЕ ПОДТВЕРЖДЁН
Часы телефонаСобственные часы телефона не разошлись с серверной привязкой больше чем на полчаса.МОМЕНТ НЕ ПОДТВЕРЖДЁНРасхождение от двух минут показывается, но вердикт понижает от тридцати
Спутниковое времяВремя спутникового приёмника против серверного момента, а при его отсутствии — против часов телефона.Против часов телефона — МОМЕНТ НЕ ПОДТВЕРЖДЁНПротив целой серверной привязки — НЕ АТТЕСТОВАНО, причина «место»
Привязка к серверному времениСчётчик с момента привязки правдоподобен: не больше 400 дней и не старше самого токена.НЕ АТТЕСТОВАНО
Место по сетиКоординаты по спутнику не спорят с местом, определённым по сотовым вышкам и Wi-Fi.НЕ АТТЕСТОВАНО
Портрет спутникового сигналаПри шести и более спутниках: не одно созвездие, разброс мощности не подозрительно ровный, уровень не завышен.НЕ АТТЕСТОВАНОТак выглядит сигнал с передатчика, а не с неба
ДвижениеКоординаты начала и конца против длительности: невозможная скорость перемещения.НЕ АТТЕСТОВАНО
Лимит длительностиЕсли код задал предел, длительность записи его не превышает.НЕ АТТЕСТОВАНО
Журнал датчиковОтпечаток записи sensors.bin сходится с записанным в манифесте, и её раскладка читается.Отпечаток не сошёлся — ИЗМЕНЁНОтпечаток цел, раскладка не читается — отметка: доказательство цело, испорчена необязательная добавка
Подмена координатВо время съёмки не работало приложение подмены местоположения.отметкаДанные такого приложения отбрасываются, координаты не записываются вовсе
Время съёмкиВремя съёмки не в будущем относительно проверяющего; очень старая съёмка отмечается.отметкаЧасы могут отставать у того, кто проверяет, — это не свойство файла
Срок сертификатовСертификаты цепочки действовали на момент съёмки (не на день проверки).отметкаФайл, снятый при действующих сертификатах, обязан остаться подлинным и через десять лет

Правило вердикта. Проверка не останавливается на первой неудаче: она выполняет все строки таблицы и собирает все причины, а слово выбирает по худшей из них. Любой провал из помеченных в таблице как «ИЗМЕНЁН» даёт этот вердикт. Иначе смотрим на набор понижений: все они про время — «Момент не подтверждён»; есть хоть одно про устройство или место — «Не аттестовано». Понижений нет — «Подлинно». Строки, помеченные «отметка», в этот набор не входят вовсе и вердикт не меняют. Файл не нашего формата или с повреждённым архивом — отказ разбирать, без вердикта.

Это правило — не пересказ: оно живёт в открытом коде одной функцией verdictOf, а набор понижений собирает downgradeReasonsOf. Обе приведены ниже целиком.

Две проверки и перебор. Проверка написана дважды — для браузера и для сервера, разными людьми в разное время и на разных библиотеках чтения архивов (JSZip и yauzl): именно архив и есть то место, где реализации расходятся охотнее всего. Набор из 279 искажённых копий настоящей съёмки прогоняется через обе, ответы сравниваются посимвольно; расхождение считается дефектом, даже если каждый ответ по отдельности выглядит разумным.

Оговорки для эксперта. Отзыв сертификатов не проверяется сознательно — иначе проверка требовала бы связи с серверами производителя и переставала бы работать без сети; истёкший сертификат — предупреждение, срок сверяется со временем съёмки. Срок действия корневого сертификата производителя тоже не сверяется: Google перевыпускал корень с тем же серийным номером. Подтверждение момента есть в файлах, снятых текущей версией приложения; файлы старых версий проверяются без него. Полный перечень допущений и точные допуски — в спецификации формата, которая публикуется вместе с кодом проверки.

Подпись ставит сам телефон в момент съёмки — ключом, который физически не может покинуть чип. Меняете хоть один байт — подпись перестаёт сходиться, и проверка называет это вслух.

3. Связь

Что работает без сети, а что нет

Съёмка случается в подвале, в поле, в контейнере и на подземной парковке. Поэтому отвечаем подробно, а не одной строкой «работает офлайн» — она была бы полуправдой.

Совсем без сети снимает только постоянный ключ сотрудника. По одноразовому коду связь нужна на старте, а если телефон не выходил в сеть дольше срока, заданного компанией, и у файла нет привязки к серверному времени, вердикт станет «Момент не подтверждён».

СценарийСнимает без связи?Что важно знать
Постоянный ключ сотрудника ✓ Да, полностью Ни одного сетевого запроса перед съёмкой. Хеш, сборка данных момента, подпись защищённым чипом, упаковка — всё происходит на устройстве. Связь не нужна ни на старте, ни во время записи, ни после.
Бесплатный тариф ✗ Нет Перед каждым кадром приложение берёт у сервера одноразовое разрешение — на нём же держатся суточные лимиты бесплатного тарифа. Нет сети — съёмка не начнётся, и приложение скажет об этом прямо. Пропала связь посреди записи — запись прерывается. Это осознанное ограничение, а не сбой: нужна съёмка без связи — нужен платный ключ.
Одноразовый код ! Связь нужна на старте Лимиты кода — сколько фото и видео разрешено — считает сервер, а не телефон, иначе их можно было бы обойти. Само по себе это занимает секунду. Дальше — как задала компания: по умолчанию обрыв связи по ходу записи её не прервёт; если включено требование постоянной связи, обрыв остановит запись — для случаев, где важно исключить длинную съёмку «в тени».
Без сети дольше 12 часов Снимает С приложением 1.4 и новее — «Подлинно»: момент съёмки держится на привязке к серверному времени, а не на сроке подтверждения. Вердикт опускается до «Момент не подтверждён» только у файлов без привязки — телефон перезагружался без связи или стоит старая версия приложения. Подтверждение того, что ключ создан под разовым вызовом нашего сервера, действует срок из кабинета — от часа до суток, и приложение обновляет его само, пока есть связь. Главное же — привязка к серверному времени: телефон помнит время сервера с последней связи, поэтому момент съёмки известен по серверным часам при любой длительности без сети, и файл остаётся подлинным. Срок из кабинета вступает в силу только для файлов без такой привязки — тогда проверка скажет «Момент не подтверждён»: подпись и содержимое сойдутся, а подтверждение момента будет просрочено. Как это устроено — под таблицей.
Координаты без связи ✓ Только спутниковые Приложение спрашивает местоположение двумя способами сразу: быстрым по вышкам и Wi-Fi и точным по спутникам. Без интернета остаётся только второй — он дольше и не берётся в помещении. Нет фикса — координат в подписи просто не будет, съёмку это не блокирует. Исключение: если компания в коде потребовала обязательную геометку, без свежего фикса кнопка съёмки заблокирована. Со связью годится любой из двух способов: свежим считается фикс не старше минуты, и сетевой подходит наравне со спутниковым, а спутниковый, если он есть, главнее и записывается первым. Поэтому в торговом зале, на складе и на подземной парковке съёмка с обязательной геометкой работает — блокирует её не помещение, а полное отсутствие фикса.
Как работает привязка к серверному времени и когда она пропадает

При каждой связи телефон запоминает время нашего сервера и показание счётчика времени с момента загрузки. Счётчик идёт и во сне, часы и часовой пояс на него не влияют, перевести его без root нельзя. Момент съёмки получается сложением: серверное время последней связи плюс то, что натикал счётчик. Поэтому длительность без сети сама по себе ничего не портит.

Привязка пропадает в двух случаях: телефон перезагрузили и он с тех пор не выходил в сеть, либо на нём приложение старее 1.4. Тогда действует срок подтверждения из кабинета — по умолчанию 12 часов. Съёмки продолжаются и подписываются как обычно, но при проверке получат «Момент не подтверждён».

В отчёте проверки момент в таком случае показан двумя границами: не раньше выдачи подтверждения и не позже его срока. Практический вывод простой: дайте телефону выйти в сеть перед выездом — хватает минуты. Дальше привязка к серверному времени держит момент при любой длительности без сети; теряется она только если телефон перезагрузить, так и не выйдя в сеть.

Что доедет позже, когда связь появится, — а что не доедет никогда.

ЧтоДоедет?Как именно
Сам файл ✓ Доедет Если компания включила автоматическую доставку. Пакет кладётся в очередь на устройстве и уходит сам, как только появится связь: приложение для этого открывать не нужно, очередь переживает и перезагрузку телефона. Снимающий может попросить «только по Wi-Fi» — тогда очередь дождётся Wi-Fi. Очередь хранит до сотни пакетов.
Счётчики использования ✓ Доедут Копятся на устройстве и не теряются.
Отпечаток файла в реестр ✗ Не доедет Отправляется одной попыткой, без очереди. Офлайн-съёмка просто не попадёт в реестр, и при проверке будет написано «не найден — съёмка могла быть без связи». Это нейтральный факт, а не подозрение.
Отметка «снято» в панели и обновления настроек ключа ! Не вовремя Отзыв ключа, окончание оплаты, смена чек-листа — до первого выхода в сеть действует последняя известная телефону версия.
Блок II · Проверка и её независимость
4. Независимость

Проверка не обращается к нашим серверам. Это можно измерить

Обычное возражение звучит так: «вы сами делаете подпись, сами её проверяете — почему я должен верить результату». Возражение справедливое, и ответ на него не словесный.

За время вердикта страница не делает ни одного обращения к сети. Отключите интернет и проверьте снова — ответ будет тот же.

0обращений к сети, пока считается вердикт — замер на видеофайле 3,7 МБ. После вердикта уходит один запрос в реестр отпечатков, и на сам вердикт он не влияет
42мсот загрузки файла до вердикта — медиана двадцати прогонов видеофайла 3,7 МБ
279способов испортить настоящую съёмку в переборе, которым сверяются две независимые проверки
Вердикт считается у читателяФайл открывается в его браузере, там же считаются отпечаток, подписи и цепочка сертификатов. К нам за этим никто не обращается — значит, и подкрутить ответ нам нечем.
Две проверки сверяются между собойОдна написана для браузера, другая для сервера — на разных библиотеках чтения архивов. Настоящая съёмка портится 279 способами, и ответы обеих обязаны совпасть до символа.

Расхождение между двумя проверками считается дефектом, даже если каждый ответ по отдельности выглядит разумным: две реализации, дающие разные вердикты на один файл, — это спор, в котором нечего предъявить.

Формат описан, и проверку можно повторить без нас. Спецификация формата и код проверки открыты: github.com/Mikhail-Savkin/Trustvisor_verify_core, лицензия Apache-2.0. По ним специалист повторяет проверку своими средствами, не обращаясь к нашим серверам и не доверяя нашему сайту. Чтобы проверить уже снятый файл, наши серверы не нужны — ни сегодня, ни через годы.

Как повторить эти замеры самому

Ноль обращений к сети. Откройте инструменты разработчика (F12 в Chrome), вкладку «Сеть», очистите список. Откройте страницу проверки, перетащите файл и дождитесь вердикта. За время вычисления вердикта не появится ни одной строки.

Сразу после вердикта появится ровно один запрос — страница спрашивает наш реестр отпечатков. Уходит только SHA-256, ответ — «есть / нет» и дата, на вердикт он не влияет. Проверить это можно грубее: отключите сеть совсем и проверьте файл снова. Вердикт будет тот же, а строка про реестр скажет, что сверка не выполнена. Мы так и проверяли.

Скорость. 42 мс — медиана двадцати прогонов видеофайла 3,7 МБ, разброс 37–56 мс, обычный ноутбук и обычный браузер; замер 6 сентября 2026, на живой странице проверки. У вас будет своё число того же порядка: считаются один SHA-256 по всему файлу, две подписи и цепочка из четырёх сертификатов. Файл размером с фотографию проверяется за единицы миллисекунд.

Перебор из 279 порч. Набор собирается из вашей собственной съёмки, а не из нашей: скрипт берёт настоящий файл и портит его всеми способами из набора — переворачивает байты, подменяет поля, ломает архив, подсовывает лишние записи. Дальше набор прогоняется через серверную проверку, а браузерную можно прогнать этой же страницей. Расхождений между ними быть не должно ни одного. Последний прогон — 5 сентября 2026 года, после смены срока подтверждения момента: расхождений ноль.

Скрипты перебора и стенд сверки лежат в том же открытом репозитории, в папке tools/ — набор искажений можно прогнать у себя.

Оговорка, чтобы обещание было точным: связь с нашим сервером нужна не в момент съёмки, а заранее и при случае. Приложение обновляет разовое подтверждение аппаратной аттестации, когда сеть есть: при подключении, при суточной перепроверке ключа и на старте съёмки. Не вышло — съёмка идёт как обычно и мгновенно, а на проверке это отразится только сроком подтверждения момента. Проверка готового файла не зависит от нас вообще.

5. Границы

Как выносится вердикт и где именно защита кончается

Слово всегда одно, но не потому, что проверка бросает работу на первом «нет»: она доходит до конца, собирает все причины и называет худшую. Лесенка ниже — порядок рассказа, а не порядок остановки: так удобно читать, от целостности файла к моменту съёмки. Ниже неё — случаи, в которых мы честно называем цену своих решений.

Файл .trustvisor
Содержимое и подписи сошлись?отпечаток файла, обе подписи манифестов, цепочка сертификатов до корня производителя
нет →Изменён
Устройство подтверждено?ключ родился в чипе, загрузчик заблокирован, ключом владеет наше приложение, признаков подмены места нет
нет →Не аттестовано
Момент съёмки подтверждён?привязка к серверному времени цела либо подтверждение сервера было свежим — и часы телефона не спорят с серверным моментом больше чем на полчаса. Если же неправдоподобна сама привязка — счётчик показывает больше 400 дней или она старше выданного токена, — это вопрос уже не к моменту, а к устройству, и вердикт будет «не аттестовано»
нет →Момент не подтверждён
Все три ответа «да»дальше проверять нечего: файл, устройство и момент подтверждены
Подлинно

Что стоит за каждым словом

Подлинно — что именно сошлось

Содержимое совпадает с тем, что подписано; подпись сделана ключом, который родился внутри аппаратного хранилища телефона; цепочка сертификатов ведёт к известному корню производителя; ключ создан под разовым вызовом нашего сервера, и этот вызов был действителен на момент съёмки; владельцем ключа в аттестации значится приложение TrustVisor с известным нам сертификатом сборки.

Изменён — почему причина не важна и что сюда ещё попадает

Причина может быть и безобидной — файл пересжали при пересылке, — и намеренной. Разницы проверка не делает и делать не должна: она отвечает на вопрос «те ли это байты», а не «зачем их поменяли».

Сюда же попадает случай, который легко спутать с соседним: цепочка аттестации приложена, но не прошла проверку. Приложить негодную цепочку — это не «не доказали», это попытка выдать одно за другое, и ответ соответствующий.

Не аттестовано — что именно расходится и чем это отличается от «изменён»

Аттестации нет вовсе, или ключ оказался в программном хранилище, или у телефона был разблокирован загрузчик. Истёкшее подтверждение момента и расхождение часов сюда не относятся — это «Момент не подтверждён». С приложения 1.4 сюда же попадает подмена места: спутниковые координаты не сошлись с координатами по сотовой сети и Wi-Fi, или спутниковое время не совпало с серверным.

«Изменён» — что-то не сошлось: подпись, содержимое, цепочка сертификатов или приложение, которому принадлежит ключ. «Не аттестовано» — всё сошлось, но аппаратного подтверждения не хватает или оно слабее ожидаемого. Первое означает «поймали на несоответствии», второе — «не доказали».

Момент не подтверждён — когда телефон получает такой ответ

Часы телефона переведены. Момент съёмки известен по серверным часам и показан в отчёте, а собственная дата файла расходится с ним больше чем на полчаса — вперёд или назад. Такой файл целый и снят настоящим устройством, но его дате верить нельзя; верить нужно серверному моменту рядом. То же самое, если съёмка датирована раньше, чем сервер выдал ей подтверждение момента.

Подтверждение момента, которое телефон получает от нашего сервера, к моменту съёмки истекло: телефон был без связи дольше срока, заданного компанией, и привязки к серверному времени у файла нет — телефон перезагружался без связи или приложение старой версии. С целой привязкой момент известен точно при любой длительности офлайна. Сюда же попадают расхождение часов телефона с сервером и несовпадение спутникового времени с системным.

Пятый исход — «не удалось открыть файл» — это не вердикт, а отказ разбирать. Он означает, что файл не является пакетом TrustVisor: не тот формат, повреждена структура архива, дописаны посторонние данные. Мы намеренно отвечаем так, а не «изменён»: «доказательство испорчено» и «дайте, пожалуйста, исходный файл» — это разные разговоры.

Где защита заканчивается — и во что это обходится обману

Карта на сегодня. Список полный: мы держим его на своей странице и правим, когда что-то меняется, — последний раз 16 сентября, когда у файла появился журнал датчиков. Подробности каждого пункта — в карточках ниже.

ЗакрытоПодмена содержимого после съёмки. Чужое приложение, выдающее себя за наше. Программный ключ вместо чипа. Разблокированный загрузчик. Переведённые часы телефона. Приложение подмены координат из магазина. Реквизит, дописанный задним числом.
Закрыто наполовинуСъёмка экрана: подпись сойдётся честно, но журнал датчиков даёт материал, по которому пересъёмку чаще всего видно глазами. Место: передатчик поддельных спутниковых сигналов возможен, но стоит десятки тысяч и требует умения. Права суперпользователя: нужен разблокированный загрузчик, а он виден в аттестации.
Остаётся открытымАккуратный передатчик сигналов с верным временем в месте без связи. Перезагрузка телефона без сети — привязка времени теряется, и файл получает «момент не подтверждён». Отзыв сертификатов не проверяем сознательно: иначе проверка перестанет работать офлайн. И главное: что происходило перед объективом, подпись не доказывает и доказать не может.
Сколько честных съёмок получают не «подлинно» — мы не знаем

Это первый вопрос, который задаёт любой технарь, и единственное число на этой странице, которого у нас нет. Вся остальная страница измерена: сорок два миллисекунды до вердикта, 279 способов испортить файл, ноль обращений к сети. А вот сколько честных съёмок получает вердикт ниже «подлинно» — не измерено.

Почему не измерено. Мерить не на чем: за всё время у нас 52 проверки, и почти все — наши собственные съёмки. Считать по ним долю было бы враньём с видом статистики. Кейсов у нас тоже пока нет, и мы об этом говорим на каждой странице.

Почему это важно именно вам. Кладовщик снимает приёмку в металлическом ангаре, спутники ловятся плохо, портрет сигнала выходит подозрительно ровным — и честная съёмка получает «не аттестовано». Файл настоящий, человек честный, а руководитель идёт разбираться. Разница между «одна съёмка из тысячи» и «одна из двадцати» — это разница между «внедрили» и «завалили поддержку».

Что с этим делать. Пилот на одной бригаде за две недели даёт эту цифру: портал пишет и вердикт, и причину понижения по каждому файлу, считать ничего не надо — выгрузка уже есть. Мы отдадим её как есть, вместе с разбором, какие причины оказались от условий, а не от обмана.

Что можно настроить уже сейчас. Часть порогов компания задаёт сама в кабинете: срок подтверждения момента — от часа до суток; требование постоянной связи во время записи — включено или нет; журнал датчиков — писать или нет; предел длительности — прямо в разовом коде. Пороги по месту и по расхождению часов сегодня общие для всех и в кабинет не вынесены; если пилот покажет, что они мешают именно вашим условиям, это первое, что мы будем менять.

Съёмка экрана: подпись честная, сцена — нет

Самый частый вопрос и самое честное ограничение. Камера, направленная на монитор или на распечатку, снимает настоящие лучи: содержимое не подменяли, ключ родился в чипе, время и место верны — проверка скажет «Подлинно» и будет права. Криптография отвечает на вопрос «этот ли телефон снял и не менялся ли файл», а не «что было перед объективом». Так устроена любая подобная система, и обещать здесь автоматический вердикт было бы обманом.

Что мы против этого делаем. Видео несёт рядом с собой журнал показаний собственных датчиков телефона за время съёмки: ускорение, поворот, магнитное поле и освещённость. Отпечаток журнала лежит внутри подписанного манифеста, поэтому подправить журнал под картинку нельзя — файл получит вердикт «Изменён». Проверка показывает журнал рядом с видео, и человек, разбирающий спор, сверяет одно с другим.

Что по нему видно глазами. Съёмка с экрана почти всегда выдаёт себя набором мелочей сразу: освещённость ровная и «комнатная» там, где в кадре улица или прожекторы; телефон поворачивается, а картинка не даёт параллакса — предметы на разном расстоянии смещаются одинаково; камера наклоняется, а горизонт в кадре стоит; яркая вспышка в кадре не отражается на датчике света. Ни один из этих признаков сам по себе не доказательство — вместе они дают эксперту опору, которой раньше не было вовсе.

Выводов проверка не делает. Она сверяет отпечаток журнала и показывает содержимое — и ни строчкой не пишет «похоже на настоящую съёмку» или «похоже на экран». Правдоподобие движения — вопрос к человеку, а не к программе; это решение записано в спецификацию, чтобы не отменилось молча.

Где журнал есть и где его нет. Сегодня — только у видео и только на платном тарифе; включает его компания в кабинете, иначе он выключен. У фотографий и на бесплатном тарифе журнала нет вовсе, и съёмка экрана там не отличается ничем. Это не оговорка мелким шрифтом, а точная граница: если журнала в файле нет, спор о пересъёмке придётся вести без него.

Как устроен журнал. Ускорение и поворот пишутся десять раз в секунду, магнитное поле — пять, освещённость — дважды; это около 154 байт на секунду записи, с потолком в 1 МиБ. Разбор даёт три разных исхода, и они не равны: отпечаток не сошёлся — вердикт «Изменён»; отпечаток цел, но раскладка не читается — предупреждение, вердикт не меняется; журнал приложен, а поля для него в манифесте нет — файл вообще не разбирается. Последнее правило закрывает обходной путь: иначе достаточно было бы стереть поле.

Владелец телефона с полным доступом к системе может обмануть приложение

Между тем, как файл записан, и тем, как он посчитан и подписан, проходит несколько секунд — приложение в это время ждёт координаты остановки. На устройстве с полученными правами суперпользователя файл в этот промежуток можно подменить, и приложение подпишет подложенное.

Против массового случая это закрыто: чтобы получить такие права, на подавляющем большинстве телефонов нужно разблокировать загрузчик, а это состояние аппаратно фиксируется в самой аттестации и попадает в вердикт — файл получит «Не аттестовано». Мы не отвергаем такие файлы полностью: люди с нестандартной прошивкой бывают добросовестными. Но и подлинными их не называем.

Чего это не закрывает: получение таких прав в обход разблокировки загрузчика. Это существенно сложнее и заметно дороже, но возможно — и это уровень взлома, который стоит дороже любого спора, ради которого его делают. Если заказчик сомневается в конкретном устройстве, достаточно попросить снять на второй телефон; а устройство, с которого обман повторяется, видно в журнале и лишается ключа.

Время: чем оно держится и где кончается

Часы телефона владелец переводит в настройках за десять секунд, поэтому время съёмки на них не опирается. Опора другая: при каждом выходе в сеть телефон запоминает наше серверное время и показание счётчика с момента загрузки. Этот счётчик идёт и во сне, часовой пояс и перевод часов на него не влияют, а сдвинуть его без полного доступа к системе нельзя. Момент съёмки — серверное время плюс то, что натикал счётчик; точность порядка секунд в сутки, сколько бы телефон ни оставался без связи. Переведённые часы видны в отчёте отдельной строкой. На сам момент съёмки они не влияют — он известен и без них, — но на вердикт влияют: расхождение собственных часов телефона с серверной привязкой больше получаса понижает его до «момент не подтверждён». Меньше получаса — показывается, но вердикт не меняет.

Где эта опора кончается: перезагрузка без связи. Счётчик обнуляется, привязка теряется, и файл проверяется по прежнему правилу — подтверждению момента, которое сервер выдаёт на заданный компанией срок (по умолчанию двенадцать часов, в кабинете от часа до суток). Если срок к моменту съёмки истёк, вердикт станет «момент не подтверждён»: подпись, файл и устройство целы, под вопросом только «когда». Честная съёмка на телефоне с уплывшими часами клейма подделки не получает — это разные вещи, и мы их различаем словом.

Место защищено слабее, чем время

Приложение подмены координат — то, что ставят из магазина за минуту, — мы отбрасываем: Android помечает такие координаты, приложение их не берёт и записывает сам факт попытки. Подмена на уровне системы требует полного доступа к ней, а это ломает аттестацию раньше, чем координаты.

Сложнее случай — передатчик поддельных спутниковых сигналов. Такой прибор стоит десятки тысяч рублей, и телефон ему верит: признака «сигнал поддельный» в Android нет. Против него у нас три косвенных заслона. Время со спутника сверяется с нашим серверным — дешёвые передатчики транслируют выбранную дату, и она не сходится. Координаты со спутника сверяются с координатами по сотовым вышкам и Wi-Fi — их подделать на порядок сложнее, чем спутники. И портрет самого сигнала: сколько спутников, из каких созвездий, насколько ровная у них сила — у передатчика с одной антенны картина слишком гладкая.

Чего это не закрывает: аккуратный передатчик с верным временем, в месте без сотовой связи и Wi-Fi или с подделкой окружения, с правдоподобным разбросом сигнала — пройдёт. Поэтому место мы называем сильным признаком, а не доказательством, в отличие от времени, устройства и целостности файла. Каждый из этих заслонов срабатывает и у честной съёмки, и чаще всего это не обман, а плохие условия приёма. Но вердикт понижает любой из них поодиночке: одного расхождения спутниковых координат с местом по сети достаточно, чтобы вместо «подлинно» вышло «не аттестовано». Мы выбрали так сознательно — лучше лишний раз позвать человека посмотреть, чем промолчать, — и поэтому же не называем место доказательством.

Реквизит подтверждает ввод, а не реальность

Номер пломбы, VIN, накладной или заявки живёт внутри подписи, и дописать его задним числом нельзя. Но мы фиксируем ровно то, что этот текст был введён в момент этой съёмки на этом устройстве. Соответствует ли номер действительности — вопрос к тому, кто ведёт соответствующий реестр.

То же и с парой «до/после»: она доказывает, что оба кадра сняты этим устройством, в эти моменты и заявлены как одна пара. Что между ними выполнялась именно заявленная работа — она не доказывает.

Отзыв: список ключей проверяем, сертификаты по сети — нет

Это две разные вещи, и их легко спутать. Список отозванных ключей аттестации Google публикует целиком, поэтому мы возим его с собой: снимок вшит в проверку, и ключ из этого списка понижает вердикт до «не аттестовано» — без единого обращения к сети. На сервере тот же список обновляется каждые шесть часов, у страницы обновляется вместе со страницей, и дата снимка видна в отчёте.

А вот отзыв самих сертификатов цепочки (OCSP, списки CRL) мы не проверяем — сознательно. Это означало бы обращение к серверам производителя при каждой проверке файла и сломало бы главное свойство: проверка работает без сети и без доверия к нам. Цену этого выбора называем вслух: сертификат, отозванный производителем, мы не увидим.

По той же логике истёкший сертификат в цепочке — предупреждение, а не отказ, и срок сверяется со временем съёмки, а не с сегодняшним днём. Файл, снятый при действующих сертификатах, обязан остаться подлинным и через десять лет.

6. Открытый код

Проверку можно не только повторить, но и прочитать

Обещание «проверку можно повторить без нас» стоит ровно столько, сколько стоит возможность его проверить. Поэтому код, которым считается вердикт, открыт: его можно прочитать, запустить у себя и написать по нему собственный проверяльщик. Ниже — что именно открыто и что нет.

Ядро проверки целиком открыто на GitHub, два куска кода приведены прямо на этой странице. Обещание «проверьте сами» стоит ровно столько, сколько стоит возможность это сделать.

Что открыто. Ядро проверки целиком: разбор пакета, сверка подписи, разбор цепочки аппаратной аттестации и вычисление вердикта. Плюс спецификация формата — по ней можно написать свой проверяльщик с нуля, не заглядывая в наш код.

И то, что обычно не показывают. Проверка работает в двух местах — в браузере у получателя и на нашем сервере, на разных библиотеках разбора архивов. Любое расхождение между ними — ошибка, даже если оба ответа выглядят разумными. Мы проверяем это машиной: берём настоящую съёмку, портим её тем же перебором и сравниваем ответы обеих сторон посимвольно. Перебор лежит в репозитории рядом с кодом — не только результат, но и сам набор искажений.

Что не открываем и почему

Сервер лицензий, личный кабинет и само приложение закрыты: там вход, платежи и администрирование. Открывать их — значит выдать карту тому, кто пришёл искать слабости. Открыто ровно то, что нужно, чтобы повторить проверку и убедиться, что вердикт не подкручен.

Нашли слабость — напишите. Сообщение о найденном способе обмануть проверку для нас ценнее, чем неприятно. Пишите на info@trustvisor.ru.

Показать два куска кода, которыми считается вердикт

Два куска — прямо здесь. Чтобы не уходить со страницы: вот код, которым решается вердикт. Он скопирован из ядра проверки без изменений.

Первый. Проверяющий не пересобирает манифест по списку полей, а берёт его сырые байты и выбрасывает ровно три поля, дописанные уже после подписания. Поэтому любое лишнее поле ломает подпись: оно попадёт в проверяемые байты, и они разойдутся с подписанными.

// три поля дописываются в манифест ПОСЛЕ подписания
const DROP = new Set(["signature", "signatureAlgorithm", "attestationChain"]);

let out = "{", first = true, j = 1;
while (j < flat.length && flat[j] !== "}") {
  const ks = j;
  j = _skipString(flat, j);          // имя поля
  const key = JSON.parse(flat.slice(ks, j));
  j++; j = _skipValue(flat, j);      // значение целиком
  // всё, чего нет в DROP, остаётся в проверяемых байтах — как было
  if (!DROP.has(key)) { if (!first) out += ","; out += flat.slice(ks, j); first = false; }
  if (flat[j] === ",") j++;
}

Второй. Из чего складывается ответ, отличный от «подлинно». Ни одного скрытого условия: каждая строка — отдельная проверка, описанная выше на этой странице, и каждая называет свою причину вслух.

TIME_DOWNGRADE_REASONS = ["challengeFreshness", "serverClock", "gpstime", "deviceClock"];

downgradeReasonsOf(c) {
  r = [];
  if (c.attestation === "missing")  r.push("attestation");   // аттестации нет вовсе
  if (st(c, "oid") === "warn")          r.push("oid");           // вопросы к владельцу ключа
  if (st(c, "rootOfTrust") === "warn")  r.push("rootOfTrust");   // загрузчик разблокирован
  if (st(c, "revoked") === "warn")      r.push("revoked");       // ключ аттестации отозван
  if (st(c, "keybound") === "warn")     r.push("keybound");      // ключ привязан не строго
  if (st(c, "motion") === "warn")       r.push("motion");        // движение не сходится
  if (st(c, "challengeFreshness") === "warn") r.push("challengeFreshness");
  if (st(c, "serverClock") === "warn")  r.push("serverClock");   // часы разошлись с сервером
  if (st(c, "deviceClock") === "warn" && c.deviceClock.downgrade)
      r.push("deviceClock");                                     // часы против привязки
  if (st(c, "gpstime") === "warn" || st(c, "gpstime") === "fail")
      r.push(c.gpstime.vsAnchor ? "location" : "gpstime");       // спутник против сервера
  if (st(c, "anchor") === "warn" && c.anchor.inconsistent)
      r.push("anchor");                                          // привязка неправдоподобна
  if (st(c, "locationNet") === "warn")  r.push("location");      // спутник против сети
  if (st(c, "gnssPortrait") === "warn") r.push("location");      // портрет как у передатчика
  if (st(c, "durationCap") === "warn")  r.push("durationCap");   // запись длиннее лимита
  return r;
}

// слово выбирается по всему набору причин, а не по первой из них
verdictOf(result) {
  if (!result.allPass)       return "TAMPERED";          // ИЗМЕНЁН
  if (!result.trustDowngrade) return "TRUSTED_CAPTURE";  // ПОДЛИННО
  return isTimeOnlyDowngrade(result)
    ? "TIME_UNCONFIRMED"                                 // МОМЕНТ НЕ ПОДТВЕРЖДЁН
    : "UNVERIFIED_DEVICE";                               // НЕ АТТЕСТОВАНО
}

// все причины про время — значит «момент не подтверждён», а не «не аттестовано»
isTimeOnlyDowngrade(result) {
  r = result.downgradeReasons;
  return r.length > 0 && r.every(x => TIME_DOWNGRADE_REASONS.includes(x));
}

Второй кусок сокращён по ширине: в исходнике вместо st(c, …) стоит внутренняя функция чтения состояния проверки, и объявлены типы. Логика не изменена — сравните построчно с verify-core.ts: функции называются так же.

Открыть репозиторий на GitHub →

Apache-2.0. В репозитории: ядро проверки, спецификация формата, набор искажений для перебора и две настоящие съёмки — фото и видео — чтобы было на чём проверять. Спецификацию и разбор по-прежнему высылаем по запросу судебному эксперту, аудитору или вашей ИТ-службе, если удобнее так.

А если вас не станет? Вопрос честный: поставщик маленький, а претензию предъявляют через год. Отвечаем устройством, а не обещанием. Ваши файлы уже подписаны, и подпись лежит внутри них; формат описан и опубликован; код, которым считается вердикт, лежит на GitHub под свободной лицензией. Проверка идёт в браузере и к нашим серверам не обращается — значит, работает и без нас. Мы не держим ваши файлы и не прячем их в свой формат: это обычные MP4 и JPEG с подписью внутри, они открываются любым плеером и просмотрщиком. Перестанет работать только то, что и должно: выпуск новых ключей и сверка по нашему реестру — а она и сегодня дополнительная опора, а не основание вердикта.

И ещё проверку можно прочитать, никуда не уходя: она выполняется у вас в браузере, а значит, приезжает вместе со страницей. Откройте на странице проверки исходный код — там весь разбор подписи, цепочки аттестации и правило вердикта, ровно то же, что в репозитории. Разница только в том, что в репозитории у этого есть история правок и тесты.

Блок III · Стандарты и данные
7. Три подхода

Метка приложения, подпись издателя и подпись устройства

Подтвердить происхождение файла пытаются тремя разными способами, и они отвечают на разные вопросы. Ниже — чем они отличаются по существу, включая мировой стандарт C2PA (Content Credentials), который делают Adobe, Microsoft, BBC и другие.

Есть мировой стандарт C2PA — он отвечает, кто издал файл и что с ним делали в редакторе. Мы отвечаем на другой вопрос: каким устройством снято. У нас C2PA не внедрён, и мы не выдаём это за сделанное.

Что сравниваемМетка в приложениисервисы фотоотчётовПодпись издателяC2PA / Content CredentialsПодпись устройстваTrustVisor
На какой вопрос отвечает «Приложение записало вот такие дату и координаты» «Кто издал этот файл и что с ним делали после» «Каким устройством и когда снято, менялся ли файл после»
Кто ставит подпись Само приложение, обычной записью в базу Любая программа с сертификатом — включая графический редактор Защищённый чип телефона; ключ не покидает устройство
Кто может проверить Только сам сервис — он показывает то, что показал изначально Любой инструмент, читающий стандарт — сильная сторона C2PA Любой — в браузере, без нас; формат публикуется
Нужен ли поставщик при проверке Да, целиком Нет, но нужен список доверенных издателей Нет; корни производителей телефонов вшиты в проверкуВшитое обновляется вместе со страницей. Копия, сохранённая на диск, замрёт на своей дате — для разбора старого файла этого достаточно, для новых устройств лучше открыть страницу заново.
Доказывает ли, что снято камерой Нет Сам по себе нет — подписать можно и отредактированный файл Да — аппаратная аттестация до чипа
Чем подтверждается время Часами сервиса Отметкой времени удостоверяющего центра Разовым подтверждением нашего сервера, вшитым чипом в сертификат ключа
Что происходит при пересылке через мессенджер Метка остаётся у сервиса, файл к ней уже не привязан Пересжатие убивает любую встроенную подпись — и стандартную, и нашу. Это свойство самих мессенджеров, а не изъян защиты: подпись удостоверяет конкретные байты, а площадка их меняет. Отправлять надо файлом, а не «как фото».

Почему это не конкуренты

C2PA и мы отвечаем на разные вопросы и лежат в разных слоях. Стандарт удостоверяет цепочку авторства: кто снял, кто отредактировал, чем. Аппаратная аттестация удостоверяет физическое происхождение: этот чип, этот момент, эти байты. Одно не заменяет другое.

Технически наш манифест можно везти внутри C2PA как собственное дополнение: чужой инструмент увидит привычный стандартный манифест, а наша проверка — полный вердикт с аттестацией.

!Честно: у нас этого пока нет

C2PA в TrustVisor не внедрён. У нас собственный формат с первого дня, и на странице выше описан именно он. Совместимость со стандартом — направление, которое мы разобрали и держим в планах, а не работающая функция.

Вторая честная оговорка: чтобы наша подпись считалась «зелёной» в чужих инструментах, нужен сертификат из их списка доверия. Российскому ИП такой сертификат западный удостоверяющий центр, скорее всего, не выдаст — и файл будет выглядеть как «подпись верна, издатель не в списке». Это ограничение среды, и обещать его обход мы не станем.

8. Данные

Что уходит с телефона, куда попадает и кто это видит

Сначала — куда девается сам файл и кто его проверяет. Потом всё остальное, что уходит с телефона, с честной причиной по каждому пункту. Сервис устроен так, чтобы собирать как можно меньше, и сверх этого списка приложение не отправляет ничего: ни рекламных трекеров, ни аналитики, ни сторонних библиотек, которые куда-то шлют данные.

С телефона уходит немногое: отпечаток файла, координаты, модель устройства и служебные метки — и по каждому пункту сказано зачем. Ни рекламных трекеров, ни аналитики, ни чужих библиотек в приложении нет.

Куда уходит снятый файл

Решает компания, а не тот, кто снимает. Режим один на все её ключи, меняется в кабинете за один клик и действует со следующей съёмки. По умолчанию включён первый — пока компания не решит иначе, ни один файл к нам не уходит. Во втором файл проходит через нас только ради проверки и не остаётся.

Только проверка по умолчанию

Файл остаётся на телефоне. К нам он не приходит вообще — ни целиком, ни частями.

В кабинете: видно, что съёмка состоялась, по какому коду и закрыт ли чек-лист. Самого файла нет.

Так же, как любой другой: почтой, мессенджером, ссылкой. Исполнитель отправляет его сам и сам решает кому — это осознанное действие, а не фон. На бесплатном тарифе других вариантов нет: автоматической отправки там не бывает.

Через проверку в ваш Яндекс.Диск

Файл приезжает к нам, проверяется и тут же уходит в вашу папку — в /TrustVisor/ и дальше по номеру заявки. У нас он не остаётся.

В кабинете: вердикт, размер, заявка, путь в вашей папке. Кнопки «Скачать» нет — скачивать не с чего.

На нашем сервере файл живёт секунды: столько, сколько идёт проверка и отправка. Если ваш Диск недоступен — отозван ключ доступа или кончилось место, — файл ждёт у нас с повторными попытками, но не дольше недели, и в кабинете видно причину. Содержимое присланных файлов мы не просматриваем и не используем.

Честная оговорка: чтобы отправить файл в вашу папку, ключ доступа к вашему диску хранится у нас, зашифрованным. Сервер каждый раз просит у Яндекса одноразовый адрес для загрузки. Ключ выдаёте вы и в любой момент отзываете на стороне Яндекса.

Что именно кладётся в вашу папку

Выбор из трёх, переключается в кабинете. По умолчанию — пакет: так было всегда, и так ничего нельзя испортить по неосторожности.

Что кладёмЧто этоКому подходит
Пакет .trustvisorпо умолчанию Один файл: видео или снимок, манифест, подпись и журнал датчиков. Открывается нашей проверкой или вашим кодом из открытого репозитория. Ни одна программа его не пересохраняет, а значит, и не портит подпись. Тем, кто складывает доказательства в архив и смотреть их не собирается
Подписанное видео или снимок Обычный MP4, PNG или JPEG: открывается любым плеером и просмотрщиком, а манифест, подпись и журнал датчиков лежат внутри него — проверку он проходит так же, как пакет. Это тот же файл, который приложение отдаёт по кнопке «Поделиться». Тем, кому съёмку нужно смотреть, а не только хранить
Оба рядом В папке заявки оказываются два файла. Места занимают примерно вдвое больше. Большинству: смотреть удобно, нерушимая копия лежит рядом

Разница между первым и вторым — не в доказательстве, а в хрупкости. Подписанное медиа теряет подпись, если его пересохранить: редактором, конвертером или пересылкой через мессенджер, который пережимает вложения. Пакет так испортить нельзя — его никто не пересохраняет. Поэтому по умолчанию стоит пакет.

Автопроверка: что происходит, пока никто ничего не нажимает

Так работает доставка. Всё это занимает секунды и не задерживает съёмку: к моменту отправки файл уже подписан и лежит на телефоне.

Телефон спрашивает, куда грузить

Приложение не знает и не решает этого само: оно называет ключ, а сервер по ключу находит компанию и её режим.

Сервер выдаёт одноразовый адрес

Ссылка живёт час и годится ровно для одного файла. Больше двадцати выданных, но не использованных адресов компания не накопит — иначе можно держать наготове пачку действительных ссылок на запись.

Файл приходит к нам

Нет сети — не беда: пакет ложится в очередь на телефоне, и её разгребает фоновая задача — приложение для этого открывать не нужно, очередь переживает перезагрузку. Снимающий может включить «только по Wi-Fi» — тогда она дождётся Wi-Fi.

Проверка тем же кодом, что у вас в браузере

Подпись, отпечаток, цепочка аттестации, момент съёмки — тот же вердикт, который получил бы любой, перетащив файл на страницу проверки.

Вердикт в журнал, письмо и вебхук

Запись появляется в «Проверках», письмо уходит по настройке тревог, событие — в вашу CRM. Файл уходит в ваш Яндекс.Диск и у нас удаляется.

Если доставка выключена, вердикт появится, когда файл проверят: перетащат в кабинете, отправят через API или откроют на странице проверки. Ещё один путь — проверка по коду: исполнитель, снявший по одноразовому коду, сам загружает файл на отдельную страницу без входа и ключей, пропуском служит сам код; вердикт с привязкой к заявке уходит в ваш журнал, а файл не хранится дольше самой проверки.

Сколько файл лежит у нас и чем удаляется

ЧтоСколькоОткуда это число
ОбычносекундыПока идёт проверка и отправка в ваш Диск. Как только Яндекс подтвердил приём — файл у нас удаляется.
Если ваш Диск недоступенне дольше 7 днейОтозван ключ, нет места, Яндекс не отвечает — повторяем по нарастающим интервалам, от 5 минут до 12 часов. Через 12 попыток или 7 дней сдаёмся и удаляем; причина видна в кабинете.
Очередь на отправку у компании5 ГБСтолько может ждать у нас одновременно. Заполнилась — новые загрузки не принимаются, пока не уедут старые.
Ссылка на скачиваниенетФайл в вашей папке, а не у нас. Удалить застрявший досрочно — кнопка «Удалить» в кабинете.

После удаления остаётся только строка в журнале: когда файл был, какого размера и с каким вердиктом. Ни содержимого, ни координат в ней нет. Отдельной базы координат у нас не существует вовсе: они живут только внутри подписанного файла. При включённой доставке файл с координатами внутри проходит через нас и удаляется вместе с отправкой в ваш Диск.

Полный список того, что уходит с телефона

Что уходит с телефонаЗачемГде остаётся и кто видит
Идентификатор устройстваAndroid ID, при активации Чтобы ключ нельзя было передать: лицензия привязывается к конкретному устройству — один ключ, одно устройство, чужой телефон по нему не снимет. Это не IMEI, не серийный номер, не номер телефона — идентификатор Android; сам по себе он личность не устанавливает и меняется при сбросе устройства к заводским настройкам. Но в кабинете он показан рядом с именем держателя ключа, и там же видно, когда телефон первый и последний раз выходил на связь. Связь эта — не чаще раза в сутки при открытии камеры, так что компания видит день, а не время съёмок и не их число.
Лицензионный ключ или код заявки Чтобы отличить, кому что можно: ключ определяет тариф и права — качество, геометку, лимиты, доставку. Для одноразового кода сервер же считает, сколько уже снято, — иначе лимит «пять кадров по заявке» можно было бы обойти. В кабинете компании — только по её собственным ключам.
Разрешение на съёмкутолько по разовому коду и на бесплатном тарифе Одноразовое число, которое чип вплетает в свою справку, — чтобы справку нельзя было переиспользовать от старой съёмки. Им же держится лимит: «по этому коду три видео» иначе обходился бы прямо на телефоне. В журнале съёмок кабинета: время, «фото» или «видео», код и заявка. Ни координат, ни содержимого. Съёмка постоянным ключом сюда не попадает — приложение вообще не спрашивает разрешения, поэтому когда и сколько снимал сотрудник, компания в кабинете не видит. Что она видит — день последнего выхода телефона на связь, строкой выше.
Отпечаток файлатолько SHA-256, сразу после съёмки Вторая опора, отдельная от файла: позже, в споре, можно показать, что отпечаток лёг в реестр в такой-то момент — значит файл существовал уже тогда, его не могли собрать вчера под нужный ответ. В реестре отпечатков. По отпечатку нельзя восстановить ни картинку, ни звук, ни координаты — это односторонняя свёртка.
Счётчикиесли компания включила отчётность Раз в период — два числа: сколько фото и сколько видео. Начало периода считает сервер, а не телефон, чтобы цифры нельзя было подкрутить переводом часов. В этом отчёте — только суммы: ни содержимого, ни координат, ни времени отдельных съёмок, ни имён файлов. Это и есть всё, что компания узнаёт о работе постоянного ключа: журнал съёмок ведётся только по разовым кодам, строка выше.
Координаты Часть доказательства — отвечают на вопрос «где снято». Вшиваются внутрь подписанного файла и на наши серверы сами по себе не отправляются. В нашей базе их нет нигде — ни в журнале съёмок, ни в реестре, ни в логах. Уходят к нам только вместе с самим файлом и только если компания включила доставку. На бесплатном тарифе координат не бывает вовсе.
Сам файлтолько при включённой доставке Включает доставку владелец ключа в панели управления, не тот, кто снимает. Сразу после съёмки пакет целиком — с геометкой, временем и моделью устройства — уходит через нас в хранилище компании. Разбор режимов — выше. В Яндекс.Диске компании. У нас — запись о файле: имя, размер, отпечаток, вердикт, путь в её папке.
Чего мы не собираем вообще Содержимое съёмок по умолчанию — оно остаётся на телефоне. Номера банковских карт — при оплате они вырезаются до записи в лог и в базу. IMEI, серийный номер, номер телефона, список контактов, список установленных приложений — приложение их даже не запрашивает: у него всего восемь разрешений, и все по делу. Шесть — камера, микрофон, интернет, состояние сети и две геолокации. Ещё два нужны фоновой доставке: не дать телефону уснуть посреди загрузки и вернуть недоставленное в очередь после перезагрузки. Последние два «обычные» — Android не спрашивает их у человека.

Кто что видит.

Телефон исполнителя

Снятое остаётся здесь. Отправить его — отдельное осознанное действие: человек сам выбирает получателя и способ. На бесплатном тарифе автоматической отправки нет вовсе.

При включённой доставке приложение показывает предупреждение с подтверждением и постоянную строку в настройках: съёмки уходят такой-то организации, отключить это в приложении нельзя — этим распоряжается она. Мы сознательно не даём исполнителю выключатель: возможность отключить доставку — это возможность спрятать неудобный кадр. Отказаться он может иначе — не снимая по этому ключу.

Кабинет компании

Свои ключи и устройства, на которых они работают. Журнал: когда по какому коду началась съёмка, сколько кадров, закрыт ли чек-лист, отмечено ли получение. История проверок с вердиктами. Если включена доставка — присланные файлы.

Точных координат в журнале нет — намеренно: они живут только внутри подписанного файла, и увидит их лишь тот, кому файл передали. Слежки за перемещениями исполнителя журнал не даёт. До данных другой компании из кабинета не дотянуться.

Реестр отпечатков

Короткая строка — SHA-256 файла — с отметкой времени. Сверка публичная и анонимная: на запрос по отпечатку реестр отвечает только «есть такой / нет» и дату. Ни компании, ни номера заявки в ответе нет. «Не найден» — нейтральный факт, а не приговор: съёмка могла идти без связи.

Честная оговорка: реестр ведём мы, и отметка времени в нём наша. Для спора, где не доверяют уже нам самим, этого мало — полностью независимым такое подтверждение делает служба отметок времени, которую ведём не мы, — её у нас пока нет.

Получатель файла

Тот, кому файл передали и кто открыл его на проверку, видит всё, что внутри подписи: время, координаты, устройство, реквизит — и вердикт. С приложения 1.4 туда же попадают координаты по сотовой сети и Wi-Fi и портрет спутникового сигнала: они нужны проверке, чтобы отличить настоящий приём от подделанного, и видны тому же получателю. На наши серверы они, как и обычные координаты, сами по себе не уходят. Проверка идёт в его браузере, без наших серверов.

Чего не видим мы сами: содержимое проходящих через нас файлов не просматриваем и не используем; координаты на наших серверах не хранятся нигде; пароли, коды входа и PIN лежат у нас только в виде необратимых отпечатков — даже мы не можем их прочитать, только сверить.

Блок IV · Интеграция и API
9. Интеграция

Как встроить в свою систему

Сервис полностью работает из кабинета, без единой строки кода. Но если у вас CRM, система заявок или 1С, всё то же самое можно делать из неё: выпускать коды на съёмку, узнавать, что съёмка состоялась, и проверять файлы. Ниже — что именно доступно, что для этого нужно и как это подключают.

Всё работает из кабинета, без единой строки кода. Интеграция нужна только чтобы делать то же самое из вашей CRM или 1С.

Что нужно с вашей стороны

Тариф Business — для одноразовых кодов, вебхуков и отчётов. Кабинет, доставка файлов и проверка по ключу есть и на Pro.

Ключ API — создаётся в кабинете, раздел «Интеграции и API», за минуту.

Публичный адрес с https — только если хотите получать вебхуки.

Событий два: captured — по коду сняли (поля at, key, case_id) и verified — файл проверен (at, verdict, file_name, source, key). Вердикт приходит именем: TRUSTED_CAPTURE, TIME_UNCONFIRMED, UNVERIFIED_DEVICE, TAMPERED — теми же, что в открытом коде.

Чего не нужно

Ничего устанавливать на свои серверы, никаких библиотек и SDK — просто HTTP.

Обращаться в поддержку за ключом: он создаётся и отзывается самостоятельно.

Отдельных ключей на операции — один ключ работает для всего.

Опрашивать статусы, если подключены вебхуки.

Два адреса и один ключ

api.trustvisor.ru — коды, статусы, отчёты, вебхуки, доставка.

portal.trustvisor.ru — проверка файлов.

Ключ передаётся в заголовке X-Api-Key. Показывается один раз при создании; потеряли — отзовите и создайте новый.

Типовой сценарий — страховая, СТО, логистика, стройка, любой другой.

Заявка

В вашей системе создаётся заявка. Система вызывает наш API и получает код на съёмку, привязанный к номеру заявки, — с нужными условиями: сколько кадров, какое качество, нужна ли геометка.

Код исполнителю

Код уходит исполнителю так, как вы обычно общаетесь: СМС, мессенджер, письмо. Ему не нужен аккаунт — только приложение и код.

Съёмка

Исполнитель вводит код и снимает. Приложение само соблюдает условия кода и ведёт чек-лист обязательных кадров.

Событие

О съёмке ваша система узнаёт от нас вебхуком или опрашивает статус кода — заявка двигается по воронке без ручной работы.

Проверка

Полученный файл система отправляет на проверку — вердикт возвращается за секунды и сам записывается в журнал кабинета.

Справочник: какие операции есть, что приходит в ответ, вебхуки и примеры запросов

Что можно вызвать. Все операции — обычные HTTP-запросы с JSON; полные примеры на curl, JavaScript и 1С — в документации.

ОперацияКакЧто получаете
Выпустить код на съёмку POST /v1/business/case-codes с номером вашей заявки. Условия по желанию: лимиты фото и видео (потолок 10 видео и 30 фото подставляется, если не указать), качество, соотношение сторон, геометка — обязательна, по желанию или выключена, требование постоянной связи, максимальная длительность, чек-лист до 20 пунктов. Код вида TV-XXXX-XXXX и два срока: сутки до первого ввода в приложение, дальше сутки с активации.
Узнать состояние кода GET /v1/business/case-codes/{код} — один код или все разом. Не введён / в работе / истёк; состоялась ли съёмка; сколько снято из разрешённого; прогресс чек-листа; отмечен ли файл полученным.
Отметить, что файл дошёл POST …/case-codes/{код}/mark-received Отметка «получен» в кабинете и в статусе кода.
Отчёт по заявке GET …/case-codes/{код}/report Выпуск, активация, каждая съёмка, чек-лист, получение, все проверки — собирается из журналов, видео на сервере нет.
Проверить файл POST portal.trustvisor.ru/v1/verify, файл в поле package. Вердикт — TRUSTED_CAPTURE (подлинно), TIME_UNCONFIRMED (момент не подтверждён), UNVERIFIED_DEVICE (не аттестовано), TAMPERED (изменён) — плюс момент съёмки с указанием, чем он подтверждён, каждая проверка поимённо и разобранный состав съёмки: номер заявки, реквизит, пункт чек-листа, координаты, время, модель устройства. Файл не хранится дольше проверки; каждая проверка попадает в журнал «Проверки».
Дать исполнителю проверить себя POST /v1/verify-by-code?code=TV-… — без ключа и без входа, сам код служит пропуском; то же из браузера — страница portal.trustvisor.ru/upload.html. Вердикт с привязкой к заявке — в ваш журнал; письма и вебхуки срабатывают те же. Подрядчик убеждается, что прислал годное, до того как уедет с объекта.
Получать события Вебхук на ваш адрес — создаётся в кабинете, подробности ниже. Сообщение, что файл проверен, и сообщение, что по коду состоялась съёмка.
Письма о вердиктах Настройка в кабинете. Письмо при вердикте «изменён» — включено по умолчанию; при «не аттестовано» — по желанию.
Доставка файлов Настройка в кабинете; список присланных с вердиктами и путями — по ключу (GET /v1/business/uploads). Файлы проверяются при приёме и уходят в ваш Яндекс.Диск; у нас остаётся журнал с вердиктом и путём. Пределы тут два, и оба про очередь, а не про хранение: очередь в самом телефоне держит сто пакетов (переполнилась — вытесняются самые старые, свежая съёмка нужнее), а у нас в ожидании отправки — до 5 ГБ на всех. Это буфер на случай, когда ваше хранилище недоступно, а не полка: застрявший файл мы пробуем отправить двенадцать раз с нарастающей паузой и удаляем не позже недели. Своего хранилища для чужих съёмок у нас нет — режима «хранить у нас» в сервере не существует с 9 сентября 2026 года.
Журналы GET /v1/business/shots, …/devices, …/verifications, …/activity Съёмки, устройства, проверки и действия в кабинете — чтение по ключу. Точных координат в журнале нет: они живут только внутри подписанного файла.

Вебхуки: события в вашу систему. Вместо опроса статусов мы сами отправляем POST-запрос на ваш адрес. Вебхук создаётся в кабинете — намеренно не по API: ключ API хранится в чужих конфигах и логах и утекает легче, чем вход в кабинет. При создании выдаётся секрет подписи, он показывается один раз.

СобытиеКогда приходитОговорка
verifiedПроверка пакета записана в журнал — из кабинета, по API или через самопроверку исполнителя. В теле — вердикт, имя файла, источник.Работает для любой проверки по вашим ключам и кодам.
capturedПервая завершённая съёмка по коду заявки. В теле — код и номер заявки.Сообщение о съёмке шлёт приложение версии 1.3.0 и новее; у исполнителя должна стоять актуальная версия.

Каждый запрос несёт заголовки с именем события, номером доставки и подписью X-TrustVisor-Signature: sha256=… — HMAC-SHA256 сырого тела вашим секретом, так что чужой запрос к вашему адресу не выдаст себя за наш. Ответьте любым кодом 2xx за 6 секунд. Не успели или упали — повторим до 6 раз с нарастающими интервалами: 1 минута → 5 минут → 30 минут → 2 часа → 6 часов; при повторе номер доставки тот же, обрабатывайте события идемпотентно. До 5 вебхуков на компанию, адрес — только внешний.

Как это выглядит в коде. Три примера — выпуск кода, ответ проверки файла и тело вебхука. Полный набор с примерами на JavaScript и 1С — в документации.

Выпустить код на съёмку под вашу заявку:

curl -X POST https://api.trustvisor.ru/v1/business/case-codes \
  -H "X-Api-Key: ваш_ключ" -H "Content-Type: application/json" \
  -d '{"case_id": "ОСАГО-4471", "max_videos": 2, "max_photos": 10,
       "gps_mode": "required", "checklist": ["4 угла", "VIN", "одометр"]}'

 {"key": "TV-X7G9-2KPL", "case_id": "ОСАГО-4471",
    "expires_at": "2026-09-05T09:12:00Z", "max_videos": 2, "max_photos": 10}

Проверить присланный файл. Ответ ниже — настоящий, получен на демонстрационном пакете с этой страницы; длинные значения обрезаны:

curl -X POST https://portal.trustvisor.ru/v1/verify \
  -H "X-Api-Key: ваш_ключ" -F "package=@REC_20260622_0702.trustvisor"

 {
  "verdict": "TRUSTED_CAPTURE",
  "isPhoto": false,
  "trustDowngrade": false,
  "moment": 1787805891039,        // момент съёмки, мс UTC
  "momentSource": "token",        // чем подтверждён: anchor | token | device
  "offlineHours": null,           // сколько телефон был без связи до съёмки
  "deviceClockShiftMin": null,    // расхождение часов телефона с сервером
  "locationMock": false,          // замечено приложение подмены координат
  "checks": {
    "session": true, "pubkey": true, "hash": true,
    "sigStart": true, "sigEnd": true, "attestation": true,
    "oid":                { "state": "pass" },
    "rootOfTrust":        { "state": "pass" },
    "challengeFreshness": { "state": "pass" },
    "anchor":             { "state": "skip" },
    "deviceClock":        { "state": "skip" },
    "serverClock":        { "state": "pass" },
    "timestamp":          { "state": "pass" },
    "keybound":           { "state": "pass" },
    "gpstime":            { "state": "skip" },
    "locationNet":        { "state": "skip" },
    "gnssPortrait":       { "state": "skip" },
    "locationMock":       { "state": "skip" },
    "durationCap":        { "state": "skip" },
    "motion":             { "state": "na" }
  },
  "meta": { "sm": { манифест начала записи },
            "em": { манифест конца: хеш видео, координаты, движение } }
}

Демонстрационный пакет снят приложением версии 1.2.1, поэтому проверки, появившиеся в версии 1.4, отвечают skip — сравнивать в таком файле нечего. Для съёмки из свежего приложения на их месте настоящие значения: anchor подтверждает момент по серверным часам и momentSource становится anchor, deviceClock показывает расхождение часов телефона, locationNet сверяет координаты со спутника с координатами по сотовой сети и Wi-Fi, gnssPortrait отдаёт портрет спутникового сигнала.

Каждая проверка возвращается поимённо, поэтому в своей системе можно не просто показать вердикт, а объяснить его: например, отдельно отметить, что подпись верна, но телефон не выходил в сеть и подтверждение момента просрочено.

Вебхук, который мы отправим на ваш адрес после проверки:

POST https://ваша-crm.ru/hooks/trustvisor
X-TrustVisor-Event: verified
X-TrustVisor-Delivery: 41f0c3b2-…
X-TrustVisor-Signature: sha256=hmac_тела_вашим_секретом

{"event": "verified", "at": "2026-09-04T12:46:21Z",
 "verdict": "TAMPERED", "file_name": "obekt-14.trustvisor", "source": "api"}

Проверьте подпись — и можно доверять телу запроса: sha256= плюс HMAC-SHA256 сырого тела вашим секретом. Событие captured устроено так же и приходит, когда по коду состоялась первая съёмка.

Рецепты для типовых систем.

Битрикс24

Роботы Битрикса умеют слать исходящие вебхуки, но не умеют добавлять свой заголовок с ключом — прямой вызов из робота не собрать. Рабочие пути: связка через Albato, ApiX-Drive, n8n или Make, либо небольшое локальное приложение Битрикс24 на вашем хостинге, которое принимает событие сделки, вызывает наш API и двигает стадию по нашим вебхукам.

amoCRM

Salesbot и digital pipeline умеют шаг «отправить вебхук» — тоже без своих заголовков, поэтому схема та же: no-code-платформа или свой мини-обработчик, который держит ключ и ходит в наш API.

Из 1С наш API вызывается штатно, без посредников: HTTPСоединение к api.trustvisor.ru, заголовок с ключом, JSON в теле. Пример на встроенном языке — в документации.

Albato, ApiX-Drive, n8n, Make, свой сайт

Любая платформа связок с шагом «HTTP-запрос с заголовками» подключается за вечер: триггер вашей CRM → POST к нам с ключом → записать код из ответа в поле сделки. Наши вебхуки эти платформы принимают штатным триггером. Свой сайт или внутренняя система — просто HTTP: выпуск кода один POST, проверка файла один POST, события — вебхук.

Лимиты запросов и коды ошибок

Лимиты и ошибки. Выпуск кодов — 30 запросов в минуту; все точки портала, включая проверку файла, — 20 запросов в минуту с одного адреса. Если ваши сотрудники выходят в интернет через общий адрес, счёт идёт на всю компанию сразу — напишите нам, поднимем под ваш объём. Это настройка, а не свойство системы.

КодЗначение
401Не передан ключ, либо он неверный или отозван.
400Запрос не удалось разобрать; для вебхуков — недопустимый адрес или превышен лимит в 5 вебхуков.
402 / 403 client_plan_requiredКоды на съёмку доступны только на тарифе Business.
403 api_key_not_allowed_hereОперации нужен вход в кабинет — ключ API её не открывает: покупка ключей, настройка доставки, удаление файлов, создание и удаление вебхуков, история платежей.
404Код или вебхук не найден — или принадлежит другой компании.
413 / 422Файл слишком большой / файл отклонён как подозрительный до полной проверки.
429Превышен лимит запросов.

Без кода вообще. Коды можно выпускать и смотреть их состояние командой в Telegram-боте — без кабинета и без API. Бота подключаем мы по запросу: пришлём ссылку на подключение.

Документация и помощь. Полное описание с примерами на curl, JavaScript и 1С — portal.trustvisor.ru/docs.html. Нужна помощь со связкой под вашу систему — напишите на info@trustvisor.ru, поможем собрать.

Попробуйте на одной команде

Мы не просим менять процессы, выделять бюджет или внедрять что-то «по всей компании». Выберите одну точку, где доверие ещё не наработано: одну бригаду, один филиал или один объект. Две недели они снимают как обычно — просто через наше приложение.

  • Ключи выпустим мы — с вашей стороны ничего настраивать не нужно
  • Обучение — три минуты: приложение выглядит как обычная камера
  • Не увидели пользы — просто перестали снимать. Ни обязательств, ни хвостов

Через две недели у вас цифры: сколько съёмок, сколько прошло проверку — и как выглядит спорный случай, когда у вас есть подпись.

Месяц бесплатно — без карты и договора. Если решите продолжить, выберете любой тариф. Срок можно продлить:

  • +2 месяцаза обратную связь
Тарифы

Проверьте на своём файле

Первый шаг делается сегодня и без нас: снимите что угодно, откройте проверку и посмотрите вердикт. Бесплатно, без регистрации и без разговора с нами — это единственный способ понять, годится ли вам сервис.

Проверить файл

Тарифы и что входит в каждый

Функции
Предложить функцию

Опишите, чего не хватает — читаем всё. Полезно указать сферу бизнеса, если задача с ней связана.

Business
Подключить тариф Business

На него придут коды доступа и инструкция.
Это подписка: карта привязывается один раз, дальше — автоматическое ежемесячное списание, пока вы не отмените.
Отменить подписку или запросить возврат — напишите на info@trustvisor.ru.
Документ
Публичная оферта

Редакция от 9 сентября 2026 г.

Индивидуальный предприниматель Савкин Михаил Андреевич (ОГРНИП 326210000056797, ИНН 212885679288), применяющий специальный налоговый режим «Налог на профессиональный доход» (далее — «Исполнитель»), публикует настоящий документ, являющийся официальным предложением (публичной офертой) в адрес любого дееспособного физического или юридического лица (далее — «Пользователь») заключить договор на изложенных ниже условиях. В соответствии с п. 2 ст. 437 ГК РФ, акцепт этих условий равносилен заключению договора.

1. Термины и определения

«Приложение» / «Программа» — программа для ЭВМ «TrustVisor» для Android, предназначенная для съёмки фото- и видеоматериалов с формированием криптографической подписи и метаданных, подтверждающих подлинность и целостность материала.

«Сайт» — trustvisor.ru и его поддомены (включая api.trustvisor.ru и portal.trustvisor.ru).

«Верификатор» — модуль (веб-страница и/или API) для проверки подлинности файлов, сформированных Приложением.

«Личный кабинет» — раздел Сайта, доступный Пользователю платного Тарифа после входа, предназначенный для управления Лицензионными ключами, Одноразовыми кодами доступа, доставкой файлов, интеграциями и подпиской.

«Лицензионный ключ» — код доступа к функциональности Приложения в пределах установленного лимита устройств.

«Тариф» — «Free» (бесплатный), «Pro» (платный, для собственных сотрудников Пользователя) или «Business» (платный, включает выпуск и отслеживание Одноразовых кодов доступа для третьих лиц, а также приобретение дополнительных Лицензионных ключей на условиях раздела 3 настоящей Оферты).

«Одноразовый код доступа» — код, выпускаемый Пользователем тарифа «Business» для однократного использования третьим лицом, не являющимся сотрудником Пользователя, в рамках отдельной заявки/дела.

«Расчётный период» — календарный месяц с даты первой оплаты.

«Подписка» — периодическая (ежемесячная) форма оплаты доступа к платному Тарифу («Pro» или «Business»).

2. Предмет договора

Исполнитель оказывает Пользователю услугу по предоставлению технического доступа к функциональности Приложения (в том числе посредством выдачи и серверной валидации Лицензионного ключа) в объёме, соответствующем выбранному Тарифу.

В состав услуги по платным Тарифам также входят: доступ к Личному кабинету; проверка файлов через Верификатор, в том числе программным способом по ключу доступа к API; передача уведомлений о событиях (съёмка состоялась, файл проверен) на указанный Пользователем адрес его информационной системы; автоматическая доставка снятых файлов в выбранное Пользователем хранилище — если Пользователь включил эти возможности в Личном кабинете.

Приложение устанавливается Пользователем самостоятельно из магазина приложений на условиях отдельного Лицензионного соглашения (EULA); предмет настоящей Оферты — именно услуга доступа, а не передача прав на само программное обеспечение. Приложение предоставляется «как есть» (as is).

3. Тарифы и функциональность

Free — 0 ₽, бессрочно. 3 видео в день, 10 фото в день, только онлайн-съёмка (нужно подключение к интернету в момент записи), без GPS в манифесте, без Блокнота.

Pro — 600 ₽ за ключ в месяц (один ключ — один пользователь/устройство). Без ограничений по количеству видео и фото, возможность офлайн-съёмки, запись геоданных в манифест, Блокнот для рабочих записей, доступ к Личному кабинету, интеграция API верификатора. При покупке от 10 ключей одновременно — 400 ₽ за ключ в месяц.

Business — 5000 ₽ в месяц. Включает всё перечисленное в Тарифе «Pro», а также доступ к панели выпуска и отслеживания Одноразовых кодов доступа для третьих лиц, не являющихся сотрудниками Пользователя (например, для проверки материалов, предоставленных клиентом или подрядчиком Пользователя в рамках отдельной заявки), в количестве до 100 кодов в расчётный период включительно.

Одноразовые коды сверх включённого количества. Каждые следующие 100 Одноразовых кодов доступа в пределах одного расчётного периода оплачиваются дополнительно в размере 4000 (четыре тысячи) рублей. Плата начисляется в момент выпуска кода, которым начинается очередная сотня (101-й, 201-й и так далее), и списывается с привязанной банковской карты. Выпуск кода не блокируется. Пользователь видит текущий расход кодов и начисленные доплаты в Личном кабинете.

Индивидуальные условия. Исполнитель вправе по соглашению с отдельным Пользователем установить иное включённое количество Одноразовых кодов доступа, иную стоимость или иные параметры Тарифа. В этом случае дополнительная плата, предусмотренная предыдущим абзацем, к такому Пользователю не применяется, а действуют согласованные с ним условия. Настоящий абзац не создаёт обязанности Исполнителя предоставлять аналогичные условия другим Пользователям.

Пользователю Тарифа «Business» также доступно приобретение Лицензионных ключей (как в Тарифе «Pro») по цене 400 (четыреста) рублей в месяц за ключ вне зависимости от количества приобретаемых ключей, а также золотая цветовая тема Приложения для таких ключей.

Исполнитель вправе менять состав функциональности Тарифов, уведомляя Пользователей платного Тарифа не менее чем за 10 дней, если изменение сокращает оплаченную функциональность.

4. Порядок заключения договора

Акцептом Оферты признаётся установка Приложения и активация в нём Лицензионного ключа, либо оплата Тарифа «Pro» или «Business». Договор считается заключённым с момента акцепта и действует до прекращения использования Приложения либо расторжения в порядке настоящей Оферты.

5. Права и обязанности сторон

Исполнитель обязуется предоставить доступ к Приложению по оплаченному Тарифу, поддерживать техническую работоспособность Приложения и связанных серверных сервисов на уровне разумных усилий, уведомлять об изменении условий Оферты. Исполнитель вправе приостанавливать действие ключа при нарушении Пользователем условий Оферты и привлекать третьих лиц (операторов платежей, хостинг) для исполнения своих обязательств.

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

Если Пользователь передаёт Лицензионный ключ и доступ к Приложению третьим лицам (в том числе своим работникам, далее — «Конечные пользователи»), он самостоятельно и за свой счёт обеспечивает соблюдение в отношении них законодательства о персональных данных, изображении гражданина (ст. 152.1 ГК РФ) и трудового законодательства (гл. 14 ТК РФ), включая получение необходимых согласий и уведомление до начала использования Приложения. Исполнитель не является стороной этих отношений. Пользователь вправе включить по своим Лицензионным ключам отчётность об использовании (агрегированные счётчики снятых фото и видео, без содержимого файлов) и автоматическую доставку снятых файлов; в этом случае Конечный пользователь информируется об этом в Приложении, а обязанность уведомить его до начала использования и оформить необходимые согласия лежит на Пользователе как работодателе (заказчике). Условия, на которых Исполнитель обрабатывает переданные ему файлы при включённой доставке, определены разделом 16 настоящей Оферты (поручение на обработку персональных данных).

Исполнитель применяет налоговый режим «Налог на профессиональный доход» (НПД). В соответствии с п. 8 ч. 2 ст. 4 Федерального закона № 422-ФЗ Исполнитель не вправе оказывать услуги по настоящей Оферте юридическому лицу, являющемуся его текущим работодателем либо являвшемуся работодателем менее двух лет назад — соответственно, такое юридическое лицо не может приобрести доступ к Сервису от своего имени. Это не распространяется на физических лиц — работников такого юридического лица, приобретающих доступ лично для себя.

6. Стоимость, подписка и оплата

Free — бесплатно. Стоимость Тарифов «Pro» и «Business» указана в разделе 3 настоящей Оферты.

Доступ к платному Тарифу («Pro» или «Business») предоставляется на условиях Подписки — ежемесячного автоматического списания. Оформляя Подписку, Пользователь даёт согласие на регулярное (рекуррентное) списание денежных средств за каждый очередной расчётный период до отказа от Подписки, а также на списание дополнительной платы, предусмотренной разделом 3 настоящей Оферты — за приобретённые Лицензионные ключи и за Одноразовые коды доступа сверх включённого количества. Размер каждой такой доплаты и основание её начисления отражаются в Личном кабинете.

При оформлении доступа к платному Тарифу Пользователь указывает ФИО/наименование организации — порядок обработки этих данных определяется Политикой конфиденциальности.

7. Пробный период

Исполнитель вправе по своему усмотрению предоставлять отдельным Пользователям временный бесплатный доступ к платному Тарифу («Pro» или «Business») на основании индивидуальной договорённости в переписке. Условия каждый раз согласовываются отдельно и не создают обязанности предоставлять аналогичные условия другим Пользователям.

8. Срок действия, расторжение и отказ от подписки

Пользователь вправе в любой момент отказаться от Подписки — в личном кабинете (раздел «Оплата») или написав на info@trustvisor.ru; дальнейшие списания прекращаются, доступ сохраняется до конца оплаченного периода. Исполнитель вправе приостановить доступ Пользователю, нарушившему условия Оферты, без возврата средств за текущий период.

9. Возврат денежных средств

Пользователь вправе обратиться за возвратом денежных средств, направив запрос на info@trustvisor.ru. Исполнитель рассматривает такое обращение в течение 10 рабочих дней и, при отсутствии обстоятельств, указанных в абзаце третьем настоящего раздела, возвращает денежные средства за неиспользованную часть оплаченного расчётного периода, за вычетом фактически понесённых расходов. Возврат производится тем же способом, которым была произведена оплата.

Плата за уже выпущенные Одноразовые коды доступа и за уже использованные Лицензионные ключи возврату не подлежит.

Возврат не производится, если доступ был приостановлен вследствие нарушения Пользователем раздела 12 настоящей Оферты.

Настоящий раздел не ограничивает права Пользователя-потребителя, установленные Законом РФ «О защите прав потребителей», в том числе право на отказ от исполнения договора об оказании услуг (ст. 32).

10. Изменение условий оферты

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

11. Ответственность сторон

Исполнитель не несёт ответственности за недоступность Приложения по независящим от него причинам (отсутствие интернета у Пользователя, неисправность устройства, форс-мажор), а также за содержание и правовые последствия использования созданных Пользователем материалов. Если Пользователю предъявлены претензии со стороны его Конечных пользователей или госорганов из-за несоблюдения раздела 5 (ненадлежащее получение согласий), Пользователь возмещает Исполнителю все убытки самостоятельно.

12. Запрещённое использование

Пользователю запрещается использовать Приложение и Сервис для: скрытого наблюдения за физическими лицами без ведома и правового основания; промышленного шпионажа и несанкционированного сбора коммерческой тайны; сбора биометрических данных без правового основания; слежки за работниками в нарушение трудового законодательства; перепродажи или сублицензирования доступа без письменного согласия Исполнителя; иных действий, нарушающих законодательство РФ или права третьих лиц. При нарушении Исполнитель вправе немедленно, без предупреждения, заблокировать доступ без возврата средств.

13. Реквизиты исполнителя

ИП Савкин Михаил Андреевич ОГРНИП 326210000056797 ИНН 212885679288 info@trustvisor.ru

14. Прочие условия

Отношения Сторон, не урегулированные Офертой, регулируются законодательством РФ. Вопросы обработки персональных данных регулируются отдельной Политикой конфиденциальности. Споры разрешаются путём переговоров, а при недостижении согласия — в порядке, установленном законодательством РФ.

15. Территория оказания услуг

Сервис предназначен для использования на территории Российской Федерации. Серверная инфраструктура Исполнителя расположена на территории Российской Федерации. Настоящая Оферта, а также отношения Сторон, связанные с ней, регулируются правом Российской Федерации.

Доступность Приложения в магазинах приложений в иных странах не означает, что Исполнитель адресует Сервис лицам, находящимся за пределами Российской Федерации, и не влечёт применения к отношениям Сторон права иных государств, если иное прямо не следует из императивных норм применимого законодательства.

16. Поручение на обработку персональных данных

Настоящий раздел применяется только в случае, если Пользователь включил автоматическую доставку снятых файлов. По умолчанию доставка выключена: снятые файлы остаются на устройстве Конечного пользователя и Исполнителю не передаются — в этом случае настоящий раздел не применяется.

Включая доставку, Пользователь как оператор поручает Исполнителю обработку персональных данных, содержащихся в снятых файлах и в сопровождающих их данных о съёмке, на условиях настоящего раздела (ч. 3 ст. 6 Федерального закона от 27.07.2006 № 152-ФЗ «О персональных данных»). Оператором остаётся Пользователь; Исполнитель действует по его поручению и самостоятельно целей обработки не определяет.

Перечень персональных данных. Изображения и видеозаписи, полученные Приложением, включая содержащиеся в них изображения граждан; данные о съёмке из подписанного манифеста — дата и время, координаты и точность определения места, модель устройства, идентификатор Лицензионного ключа или Одноразового кода доступа, реквизит съёмки, заданный Пользователем.

Перечень действий. Приём файла от Приложения; автоматизированная проверка подписи и целостности файла; передача файла в хранилище, указанное Пользователем; временное хранение на время передачи, а при недоступности хранилища Пользователя — на время повторных попыток, но не более 7 (семи) суток с момента приёма; удаление файла с серверов Исполнителя сразу после передачи либо по истечении указанного срока. Иные действия с содержимым файлов Исполнителем не совершаются: содержимое не просматривается, не используется для обучения моделей и не передаётся третьим лицам, за исключением привлечённых Исполнителем лиц, указанных в Политике конфиденциальности.

Цели обработки. Доставка файла адресату, выбранному Пользователем, и проверка подлинности файла для отображения её результата в Личном кабинете Пользователя. Иных целей обработки поручением не предусмотрено.

Конфиденциальность и защита. Исполнитель обязуется не раскрывать и не распространять персональные данные без согласия Пользователя, если иное не предусмотрено федеральным законом, и обеспечивать их безопасность при обработке в соответствии со ст. 19 152-ФЗ: обработка на серверах, расположенных на территории Российской Федерации; передача по защищённым каналам связи; ограничение доступа кругом лиц, которым он необходим для исполнения поручения; ведение журнала действий, доступного Пользователю в Личном кабинете.

Срок действия и уничтожение. Поручение действует, пока у Пользователя включена доставка. При выключении доставки, прекращении договора либо по письменному требованию Пользователя Исполнитель прекращает обработку и уничтожает переданные файлы; сведения об уничтожении предоставляются Пользователю по его запросу.

Ответственность. Исполнитель отвечает перед Пользователем за соблюдение условий настоящего поручения. Ответственность перед субъектами персональных данных за обработку, осуществляемую Исполнителем по поручению, несёт Пользователь как оператор (ч. 5 ст. 6 152-ФЗ).

Что остаётся на Пользователе. Правовое основание обработки, получение согласий Конечных пользователей и их уведомление до начала использования Приложения — в порядке, предусмотренном разделом 5 настоящей Оферты.

Документ
Политика конфиденциальности

Редакция от 9 сентября 2026 г.

1. Оператор

ИП Савкин Михаил Андреевич, ОГРНИП 326210000056797, ИНН 212885679288. Контакт: info@trustvisor.ru

2. Какие данные обрабатываются

Через Приложение (на сервер лицензий): уникальный идентификатор устройства (Android ID) — при проверке и выдаче лицензионного ключа; сам лицензионный ключ; IP-адрес и стандартные технические данные — в логах сервера; при оформлении платного Тарифа («Pro» или «Business») — ФИО/наименование организации и id платёжной транзакции; при включённой отчётности об использовании — Пользователем в настройках приложения либо владельцем Лицензионного ключа в панели управления — агрегированное количество снятых фото и видео за период и время последнего полученного отчёта (для тарифов «Pro»/«Business», без содержимого или иных метаданных самих файлов); о включении отчётности владельцем ключа Конечный пользователь информируется в настройках Приложения; отпечаток (SHA-256) снятого файла — депонируется в реестр подтверждения сразу после съёмки (только хэш, сами фото и видео не передаются); при съёмке по Одноразовому коду доступа — отметка о факте съёмки (тип файла, время, номер заявки и пункт чек-листа, если они заданы владельцем кода) — она отображается владельцу кода в панели.

Через Личный кабинет (portal.trustvisor.ru): адрес электронной почты владельца доступа — он же является именем для входа; одноразовые коды входа, направляемые на этот адрес (хранятся в необратимом виде и погашаются после использования); сведения о доверенных устройствах входа, с которых осуществлялся вход, и заданный для них ПИН-код (хранится в необратимом виде, восстановить его невозможно); при включённом двухфакторном подтверждении — секрет приложения-аутентификатора в зашифрованном виде и резервные коды; IP-адрес и стандартные технические данные сессии; журнал действий в кабинете (вход, выпуск и отзыв ключей, изменение настроек доставки и интеграций).

Через сайт: при заполнении формы «Запросить демо» — имя, название компании, e-mail, текст сообщения; стандартные технические данные посещения (IP-адрес, логи веб-сервера); при согласии посетителя — обезличенные события использования Сайта: какие страницы открывались, докуда прокручены, какие кнопки нажаты, начата и отправлена ли форма, запускалась ли проверка файла и с каким вердиктом. Без согласия эти события не собираются вовсе (состав, условие и сроки — в разделе 9).

Не собирается вообще: содержимое фото- и видеозаписей (хранится только на устройстве Пользователя; исключение — включённая автоматическая доставка: её включает владелец Лицензионного ключа (организация) в панели управления, и тогда снятый файл целиком передаётся в выбранное владельцем ключа хранилище. Через серверы Исполнителя файл при этом проходит транзитом: он принимается, автоматически проверяется на подлинность и целостность, передаётся в хранилище владельца ключа и удаляется с серверов Исполнителя сразу после передачи. Собственного хранилища для снятых файлов Исполнитель не предоставляет. Если хранилище владельца ключа временно недоступно, файл сохраняется у Исполнителя исключительно ради повторных попыток передачи и удаляется в любом случае не позднее 7 (семи) суток с момента приёма. Исполнитель содержимое файлов не просматривает и не использует. О включённой доставке Конечный пользователь информируется в самом Приложении — предупреждением до съёмки и строкой в настройках; отключить доставку в Приложении он не может, этим распоряжается владелец ключа), GPS-координаты (встраиваются в манифест снятого файла; при выключенной доставке остаются вместе с ним на устройстве, при включённой — передаются в составе файла тому же адресату, что указан выше), содержимое Блокнота приложения. Сторонние аналитические или рекламные модули в Приложении не используются.

3. Цели обработки

Предоставление доступа к функциональности Приложения по выбранному Тарифу; идентификация Пользователя и учёт выданных лицензионных ключей; предоставление доступа к Личному кабинету и защита этого доступа; предотвращение злоупотреблений (в т.ч. отзыв ключа при недостоверных данных); ответ на запросы через форму «Запросить демо»; связь с Пользователем по вопросам использования Сервиса.

4. Правовое основание

Данные, необходимые для исполнения договора (Оферты) — на основании п. 5 ч. 1 ст. 6 152-ФЗ, без отдельного согласия. ФИО/наименование и id транзакции при оформлении платного Тарифа («Pro» или «Business»), а также данные формы «Запросить демо» — на основании согласия субъекта (п. 1 ч. 1 ст. 6 152-ФЗ).

В отношении Конечных пользователей (работников и подрядчиков владельца Лицензионного ключа) правовое основание обработки обеспечивает владелец ключа как их работодатель или заказчик — в порядке, предусмотренном разделом 5 Оферты.

5. Место и срок хранения

Данные хранятся на серверах, расположенных на территории РФ (ч. 5 ст. 18 152-ФЗ).

ЧтоСрок
Данные лицензиисрок действия ключа и 1 год после истечения/отзыва
Данные, связанные с оплатойсроки по законодательству о бухгалтерском/налоговом учёте (как правило, не менее 4 лет)
Технические логине более 90 дней
Заявки с формы «Запросить демо»до отзыва согласия, но не более 3 лет
Одноразовые коды входа в кабинетдо использования, но не более 1 часа
Сведения о доверенных устройствах входадо отзыва устройства владельцем доступа либо 1 год после последнего входа
Снятые файлы при включённой доставкедо передачи в хранилище владельца ключа (как правило — секунды); при недоступности хранилища — не более 7 суток, далее удаляются автоматически
Отпечатки (SHA-256) в реестре подтверждениябессрочно

Почему реестр хранится бессрочно. Смысл реестра — подтвердить, что файл существовал уже в момент съёмки. Такое подтверждение обязано пережить и лицензию, и договор: если запись удалить, доказательство перестанет работать именно тогда, когда понадобится. В реестр записывается только математический отпечаток файла — по нему невозможно восстановить ни изображение, ни звук, ни координаты.

6. Передача третьим лицам

Данные не продаются и не передаются в целях, не связанных с исполнением договора.

Для работы Сервиса привлекаются: хостинг-провайдер (размещение серверов на территории РФ) и оператор платёжных услуг (обработка оплаты платного Тарифа) — как лица, осуществляющие обработку по поручению Оператора.

Передача владельцу Лицензионного ключа. Если владелец ключа (организация) включил в панели управления автоматическую доставку, снятый файл целиком — включая изображение или видеозапись и содержащиеся в манифесте GPS-координаты, время и модель устройства — передаётся владельцу ключа в его собственное хранилище; через серверы Исполнителя файл проходит транзитом, без хранения. Владелец ключа выступает самостоятельным лицом, определяющим цели дальнейшей обработки этих данных.

Передача уведомлений в информационную систему владельца ключа. Если владелец ключа настроил в панели управления адрес для уведомлений, на этот адрес передаются сведения о наступивших событиях — факт съёмки (тип файла, время, номер заявки) и результат проверки файла. Содержимое файлов таким образом не передаётся.

Об обеих возможностях Конечный пользователь информируется в Приложении до начала съёмки.

7. Права субъекта персональных данных

Вы вправе получить информацию об обработке своих данных, требовать их уточнения, блокирования или уничтожения, отозвать согласие, обратиться в Роскомнадзор или в суд. Для реализации прав — обращение на info@trustvisor.ru. Отзыв согласия в отношении данных, необходимых для исполнения договора, может повлечь невозможность дальнейшего доступа к платному Тарифу.

Порядок направления запроса на удаление данных описан на отдельной странице Сайта: trustvisor.ru/#data-deletion

8. Меры защиты

Передача данных — по защищённому протоколу (HTTPS/TLS). Доступ к административным функциям управления ключами ограничен паролем и отдельным секретным ключом доступа. Вход в Личный кабинет производится по одноразовому коду, направляемому на подтверждённый адрес электронной почты; владелец доступа может дополнительно включить двухфакторное подтверждение. ПИН-коды доверенных устройств и одноразовые коды входа хранятся в необратимом виде — их невозможно прочитать, только сверить. Секрет двухфакторного подтверждения хранится в зашифрованном виде. Состав лиц с доступом к серверной инфраструктуре ограничен.

9. Файлы cookie, данные в браузере и счёт посещений

В Личном кабинете используются технически необходимые cookie — для поддержания сессии входа и защиты от подделки запросов; без них вход невозможен.

На Сайте cookie не используются вовсе. Вместо них Сайт сохраняет в самом браузере посетителя выбранную тему оформления («tv-theme») и ответ на вопрос о согласии («tv-consent»); что появляется после согласия — ниже.

Посещаемость Исполнитель считает сам, и только с согласия посетителя. Сторонние аналитические и рекламные счётчики — в том числе Яндекс.Метрика и Google Analytics — не используются. Пока посетитель не нажал «Принять» в баннере, на сервер не передаётся ни одного события. При согласии записываются: вид события (открытие страницы, глубина прокрутки, нажатие на ссылку или кнопку с её надписью, начало и отправка формы, запуск проверки файла и её вердикт словом, переход на внешнюю ссылку, выбранная тема), адрес страницы без строки запроса, домен, с которого посетитель пришёл, метки рекламной кампании из ссылки, класс устройства и ширина окна, язык браузера, номер вкладки и время события по часам сервера. IP-адрес посетителя при этом не записывается; содержимое форм, имена и содержимое проверяемых файлов — тоже. Записи хранятся 90 дней и удаляются автоматически.

Как спрашивается согласие. При первом заходе в правом нижнем углу появляется баннер с двумя ответами — «Принять» и «Отказаться». До ответа события копятся только в памяти вкладки и на сервер не уходят: согласился — уйдут разом, отказался или закрыл страницу не ответив — пропадут вместе со вкладкой. Отказ означает, что счёт посещений не ведётся вообще, а не что он ведётся обезличенно.

Что сохраняется в браузере и когда. До согласия — ничего. После «Принять» появляются номер вкладки («tv-sid», живёт до её закрытия) и случайный номер посетителя («tv-vid»), не связанный ни с какими сведениями о нём и нужный только чтобы отличать повторный визит от нового. Ответ на сам вопрос («tv-consent») сохраняется в любом случае — иначе баннер спрашивал бы снова на каждой странице. Если браузер передаёт признак «Do Not Track», баннер не показывается и сбор не ведётся. Отозвать согласие можно, очистив данные сайта средствами браузера.

10. Изменения политики

Оператор вправе вносить изменения в настоящую политику. Актуальная версия всегда размещена на сайте trustvisor.ru с указанием даты редакции.

11. Уведомление об изменениях

Если изменения расширяют состав обрабатываемых данных или цели обработки, Оператор доводит их до сведения пользователей до начала обработки в новом объёме: в Приложении — отдельным экраном с указанием того, что именно изменилось, требующим подтверждения; владельцам доступа к Личному кабинету — письмом на указанный адрес электронной почты.

12. Территория и применимое право

Обработка персональных данных осуществляется на территории Российской Федерации и регулируется законодательством Российской Федерации, в том числе Федеральным законом № 152-ФЗ. Сервис предназначен для использования на территории Российской Федерации.

Документ
Лицензионное соглашение (EULA)

Редакция от 2 сентября 2026 г.

ИП Савкин Михаил Андреевич (ОГРНИП 326210000056797, ИНН 212885679288, далее — «Правообладатель») является правообладателем программы для ЭВМ «TrustVisor». Устанавливая и/или используя Приложение, Пользователь принимает условия настоящего Соглашения.

1. Соотношение с Офертой

Настоящее Соглашение регулирует права на использование Приложения как объекта интеллектуальной собственности. Условия доступа к тарифам, оплата и подписка регулируются отдельной Публичной офертой. При противоречии по тарифам и оплате действует Оферта, по правам на код — настоящее Соглашение.

2. Предоставляемая лицензия

Правообладатель предоставляет Пользователю простую, неисключительную, безвозмездную лицензию на установку и использование Приложения, а также на использование связанных с ним веб-интерфейсов (Верификатора и Личного кабинета) в объёме, соответствующем оплаченному Тарифу. Все права на Приложение, включая исключительное право, исходный код, дизайн и товарные знаки, принадлежат Правообладателю и не передаются Пользователю. Это не относится к ядру проверки подлинности файлов, опубликованному Правообладателем отдельно на условиях лицензии Apache License 2.0 (github.com/Mikhail-Savkin/Trustvisor_verify_core): права на него предоставляются на условиях указанной лицензии, а права на Приложение публикация ядра не затрагивает.

3. Ограничения

Запрещается: распространение, сдача в аренду или сублицензирование Приложения третьим лицам вне порядка, предусмотренного Офертой; модификация, декомпиляция и обратная разработка Приложения (за исключением случаев, прямо разрешённых ст. 1280 ГК РФ); удаление знаков охраны авторских прав; создание конкурирующих продуктов на основе Приложения; обход технических средств защиты и ограничений Тарифов.

4. Обновления

Правообладатель вправе выпускать обновления Приложения. Условия Соглашения распространяются на все последующие версии, если при обновлении не указано иное.

5. Отсутствие гарантий

Приложение предоставляется «как есть» (as is), без гарантии бесперебойной работы на всех устройствах. Правообладатель не гарантирует, что созданные материалы будут приняты в качестве доказательств в конкретном судебном или ином процессе — это относится к компетенции органа, рассматривающего дело.

6. Ограничение ответственности

Правообладатель не отвечает за косвенные убытки и упущенную выгоду в связи с использованием Приложения, в максимальной степени, допустимой законодательством РФ. Это не ограничивает права Пользователя-потребителя, установленные императивными нормами закона.

7. Срок действия

Соглашение действует с момента установки Приложения до его удаления. Правообладатель вправе прекратить лицензию при нарушении Пользователем раздела 3.

8. Распространение через магазины приложений

При получении Приложения через Google Play или аналогичный сервис на Пользователя также распространяются условия соответствующего магазина. Оператор магазина приложений не является стороной настоящего Соглашения.

9. Реквизиты правообладателя

ИП Савкин Михаил Андреевич ОГРНИП 326210000056797 ИНН 212885679288 info@trustvisor.ru

10. Применимое право

Настоящее Соглашение регулируется правом Российской Федерации. Приложение предназначено для использования на территории Российской Федерации; его доступность в магазинах приложений в иных странах не влечёт применения права иных государств, если иное прямо не следует из императивных норм применимого законодательства.