Я думаю, вы захотите вести журнал действий, предпринятых пользователем.Чтобы избежать записи в копию исходных данных, я бы держал журнал в отдельном файле.Сохраните изменения пользователя с информацией о отметке времени.
Когда придет время совершать транзакцию, просто прочитайте список изменений в файле журнала и примените их, упорядоченные по отметке времени.
Когда пользователю необходимо прочитать данные из файла во время процесса редактирования, вам придется считывать соответствующую часть исходного файла в память и применять изменения к этим данным из файла журнала.
Это может быть самой сложной частью, в зависимости от формата двоичного файла.Если у вас есть возможность каким-либо образом индексировать содержимое двоичного файла, я бы использовал эту информацию в журнале редактирования.Таким образом, вы можете извлечь только те данные, которые вам нужны, из файла журнала, и вы сможете определить, какие правки применимы к этим данным.
Если все, что у вас есть, это большой, бесформенный большой двоичный объект, выВам придется хранить все это в памяти и применять все изменения каждый раз, когда вы выполняете чтение.Я думаю, здесь есть место для оптимизации, но в целом все еще ужасно.Не имея возможности ограничить область чтения, вы должны предположить, что любое изменение может изменить любые данные в любое время.
Что касается защиты правок, это сложный вопрос.Если вы работаете в среде, которой доверяете, вы можете избежать секретности и использовать ее для аутентификации информации.Это громоздко, но вы можете хэшировать конкатенацию двоичного файла, журнала редактирования и секрета, известного только приложению.(Без секрета любой может зайти, изменить файл и вставить новый хэш.)
Если вы работаете на машине, локальной для пользователя (например, на рабочем столе), хранить секреты можнодействительно сложно, особенно с управляемым кодом.Это тема сама по себе, и у меня нет хорошего ответа для вас.