【问题标题】:Storing data on client side - How to protect against manipulation?在客户端存储数据 - 如何防止操纵?
【发布时间】:2018-05-23 12:21:45
【问题描述】:

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

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

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

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

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

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

我的问题:
在将数据发送到服务器时,我有什么方法可以提供不错的完整性吗?如果可以,怎么做?

【问题讨论】:

  • 你不能。客户端可以触摸的任何数据都可能被视为已泄露。你能做的最好和最干净的事情是确保数据到达 Laravel 后端后的完整性。
  • 这就是我的想法……但遗憾的是,后端最多只能进行合理性检查。在这种情况下,Web 应用程序无法确保完整性。不过感谢您的建议!
  • 也许您可以在发送到 Web 服务器之前根据 IPC 数据重新验证。
  • 您需要明确要保护它免受哪些威胁。攻击者能否仅访问磁盘中的原始数据,或者他可以使用用户凭据进入系统?
  • “攻击者”可以访问他的用户帐户。该程序应他的要求在他的用户帐户下运行。我想保护我正在读取的数据,以避免操纵从这些值构建的服务器端统计信息。重新验证不起作用,因为 IPC 数据在我的程序运行期间不断变化。

标签: c# php security encryption data-integrity


【解决方案1】:

你可以做两件事:

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

  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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 2011-03-02
    • 1970-01-01
    • 2022-11-26
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    相关资源
    最近更新 更多