TXINT
Формат выгрузки TXINT
TXINT выгружает расследование в JSON, CSV, Excel, Markdown и PDF. Файл JSON несет журнал расследования целиком, поэтому получатель проверяет его по самому файлу, без сервиса и его базы.
Состав выгрузки
Отчеты Markdown и PDF собираются из одного содержания, и раздел не может оказаться в одном и пропасть в другом. Отчет пишется на языке, который выбран в интерфейсе.
- Что это за расследование и оговорка о том, что анализ эвристический.
- В PDF снимок графа таким, каким он был на экране аналитика.
- Оценка риска со всеми основаниями, правилом и пределами.
- Крупнейшие движения средств.
- Чего в графе нет.
- Что ответили источники данных.
- Где след переходит между сетями.
- Заметки аналитика и названные в них адреса.
- Находки и решение аналитика по каждой.
- Журнал расследования и его голова.
Каждый фрагмент текста помечен как слова сервиса, как данные извне или как идентификатор, и экранируется по этой пометке. Повторная сборка того же отчета дает PDF, совпадающий байт в байт.
Журнал расследования
Каждый шаг, который меняет то, что говорит расследование, записывается в журнал в момент шага: создание, сбор, раскрытие узла, запуск распознавателей, решение аналитика, заметка, выгрузка. Запись называет, кто и когда сделал шаг, и несет хеши SHA-256 того, что получилось.
Каждая запись несет и хеш предыдущей. Правленая или удаленная запись рвет цепочку в месте, которое проверка называет.
Что хешируется
- Граф: у каждого узла идентификатор, сеть, адрес и метки (источник, имя, род), у каждого перевода идентификатор, сеть, транзакция, концы, актив, сумма текстом, время, блок, тип и состояние. Записи упорядочены по идентификатору. Вписанное человеком в граф не входит: заметки хранятся отдельными записями журнала.
- Находки: идентификатор, распознаватель и его версия, важность, уверенность текстом с тремя знаками после запятой, идентификаторы узлов, связей и транзакций и пороги. Текст объяснения в хеш не входит: он есть на двух языках и говорит одно и то же.
- Файл: байты выгрузки ровно в том виде, в каком она отправлена.
Хеш графа после сборки считается по графу, прочитанному из базы. Так последующие проверки сравнивают то, что хранится.
Канонический текст
Хеш считается от JSON с ключами по алфавиту, без пробелов между элементами, в кодировке UTF-8, с
кириллицей и другими знаками как есть. Схема записей журнала называется txint-custody-v1.
Запись журнала хранится тем самым текстом, от которого посчитан ее хеш. Пересобранная из столбцов базы, она могла бы разойтись с хешем из-за того, что одно число записано иначе.
Проверка выгрузки
Получатель файла JSON проверяет три вещи, и все нужное для этого лежит в самом файле.
- Журнал цел: хеш каждой записи сходится, каждая ссылается на предыдущую, номера идут без пропусков.
- Голова цепочки, записанная в файле, - это последняя запись журнала.
- Граф и находки в файле дают те хеши, которые журнал записал последними.
Для этих проверок хватает стандартной библиотеки любого языка: SHA-256 и канонического JSON по правилам выше.
Сверка с журналом сервиса
Запись о выгрузке пишется в журнал сервиса после файла, потому что файл не может содержать собственный хеш. Хеш файла в этой записи равен SHA-256 полученного файла, а ссылка на предыдущую запись равна голове цепочки внутри файла.
Голова цепочки в каждой выгрузке хранится вне сервиса, у получателя. По ней видно, не переписали ли журнал в базе сервиса целиком после выгрузки.