在客户端存储数据 - 如何防止操纵?

时间:2017-12-09 11:40:24

标签: c# php security encryption data-integrity

常规/简介:
我在一个项目中工作,我们有两个软件部分。有一个在用户计算机上运行的客户端应用程序和一个管理与该项目相关的许多事情的Web应用程序。

客户端应用程序通过IPC从另一个程序读取许多不同的值,我没有源代码,我没有选择更改我正在读取的其他程序中的任何内容。 /> 因此,我的应用程序收集这些值并将它们存储在本地,因为它并不总是连接到Web应用程序。

由于Web应用程序构建统计信息以及更多这些值,并且由于收集的值对整个项目非常重要,因此用户不应该更改它们(或者至少它应该非常难 - 我我很确定你无法为客户端上的数据提供100%的安全性。

仅仅是为了获取完整信息:客户端应用程序是用C#编写的,而Web应用程序是基于Laravel Framework(PHP)。但这个问题更多的是关于理论,而不是如何对此进行编码。

我的想法:
我在考虑使用非对称加密。客户端使用Web应用程序服务器的公钥加密数据。现在数据已加密存储。但是,当然,客户端有这个公钥。因此,攻击者可以继续加密他自己的操纵值并将其存储在文件中。

另一个以加密为基础的想法是,我不仅可以加密数据,还可以加密整个文件并使用不太明显的格式。但这更像是通过默默无闻的安全性,据我所知应该避免。另外,我们可以反编译客户端应用程序并立即使用我正在使用的格式。

我的问题:
在将数据发送到服务器时,有什么方法可以提供相当好的完整性吗?如果是这样,怎么办呢?

1 个答案:

答案 0 :(得分:1)

您可以做两件事:

  1. 放弃,因为client software authenticity is not the server's problem,理论上不可能确切地知道另一端正在以一种不可欺骗的方式运行你想要的软件。

  2. 如果您使用客户端软件作为数据骡子,请使用hash_hmac()hash_equals()对数据进行身份验证,以使其具有防篡改功能。

  3. 例如,您可以通过在MAC前面添加MAC来存储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。