Хранение данных на стороне клиента - Как защититься от манипуляций?

Общие/Введение.
Я работаю над проектом, в котором у нас есть две части программного обеспечения. Существует клиентское приложение, которое запускается на компьютере пользователя, и веб-приложение, которое управляет многими вещами, связанными с этим проектом.

Клиентское приложение считывает множество различных значений через IPC из другой программы, исходного кода которой у меня нет, и у меня нет возможности что-либо изменить в той другой программе, из которой я читаю.
Итак, мое приложение собирает эти значения и сохраняет их локально, поскольку оно не всегда подключено к веб-приложению.

Поскольку веб-приложение строит статистику и многое другое из этих значений, и поскольку собранные значения очень важны для всего проекта, пользователь не должен иметь возможности их изменить (или, по крайней мере, это должно быть очень сложно - я почти уверен вы не можете обеспечить 100% безопасность данных на клиенте).

Просто для полной информации: клиентское приложение написано на C#, а веб-приложение основано на Laravel Framework (PHP). Но этот вопрос больше о теории, чем о том, как это закодировать.

Мои мысли
Я думал об асимметричном шифровании. Клиент шифрует данные открытым ключом сервера веб-приложений. Теперь данные хранятся в зашифрованном виде. Но, конечно, у клиента есть этот открытый ключ. Следовательно, злоумышленник может просто зашифровать свои измененные значения и сохранить их в файле.

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

Мой вопрос:
Могу ли я каким-либо образом обеспечить достойный уровень целостности при отправке этих данных на сервер? Если да, то как это можно сделать?


person Niklas S.    schedule 09.12.2017    source источник
comment
Вы не можете. Любые данные, к которым может прикоснуться клиент, могут считаться скомпрометированными. Лучшее и самое чистое, что вы можете сделать, это обеспечить целостность данных, как только они достигнут бэкенда Laravel.   -  person Andrei    schedule 09.12.2017
comment
Это то, о чем я думал... но, к сожалению, серверная часть может в лучшем случае выполнять проверки правдоподобия. В этом случае веб-приложение не может обеспечить целостность. Спасибо за ваше предложение!   -  person Niklas S.    schedule 09.12.2017
comment
Возможно, вы можете повторно проверить данные IPC перед отправкой на веб-сервер.   -  person Crowcoder    schedule 09.12.2017
comment
Вам нужно уточнить, от каких угроз вы хотите защитить это. Может ли злоумышленник получить доступ только к необработанным данным с диска или он может войти в систему, например, под учетными данными пользователя?   -  person Evk    schedule 09.12.2017
comment
Злоумышленник может получить доступ к своей учетной записи пользователя. Программа запускается под его учетной записью пользователя по его запросу. Я хочу защитить данные, которые я читаю, чтобы избежать манипуляций со статистикой на стороне сервера, построенной на основе этих значений. Ревалидация не работает, так как данные IPC постоянно меняются во время выполнения моей программы.   -  person Niklas S.    schedule 11.12.2017
comment
Что ж, вы могли бы защитить его, ЕСЛИ у вас был некоторый доступ к исходному приложению, к которому вы обращаетесь через IPC. Этот метод называется signing. Однако здесь это довольно бессмысленно, потому что, если ваше клиентское приложение читает исходные данные «сырыми», вы ничего не можете с этим поделать. если вам нужно защитить данные от случайного редактирования, подумайте о том, чтобы хранить их таким образом, чтобы конечный пользователь не мог получить к ним доступ. Если это необходимо для защиты от реальных злонамеренных манипуляций, вам необходимо связаться с производителем приложения, которое создает дату, чтобы узнать, какой безопасный интерфейс они могут добавить.   -  person zaitsman    schedule 13.12.2017


Ответы (1)


Есть две вещи, которые вы можете сделать:

  1. Откажитесь, потому что подлинность клиентского ПО не является проблема с сервером, и теоретически невозможно знать наверняка, что на другом конце используется программное обеспечение, которое вы намерены использовать таким образом, который нельзя подделать.

  2. Если вы используете клиентское программное обеспечение в качестве мула данных, используйте hash_hmac() и hash_equals() для проверки подлинности данных, чтобы они были защищены от несанкционированного доступа.

Например, вы можете сохранить MAC-адрес, добавив его к данным:

$key = random_bytes(32); // Store me for long-term. Maybe per-client?

$data = "foo";
$mac = hash_hmac('sha256', $data, $key);
echo $data . $mac;

А затем проверить его после возврата клиентским программным обеспечением:

if (mb_strlen($message, '8bit') < 64) {
    throw new Exception("Invalid message length.");
}
$mac = mb_substr($message, 0, 64, '8bit');
$data = mb_substr($message, 64, null, '8bit');
$recalc = hash_hmac('sha256', $data, $key);
if (!hash_equals($recalc, $mac)) {
    throw new Exception("Invalid MAC.");
}
// Now we know $data is legitimate.

Важно использовать hash_equals(), а не == или ===, чтобы предотвратить атаки по времени.

Обратите внимание, что это делает любые такие данные неизбежно доступными только для чтения. Если вы хотите, чтобы они могли редактировать данные, вы остановились на варианте 1.

person Scott Arciszewski    schedule 20.12.2017