2017-12-09 7 views
1

一般/紹介:
私は2つの部分のソフトウェアがあるプロジェクトで働いています。ユーザーのコンピュータで実行されるクライアントアプリケーションと、このプロジェクトに関連する多くのことを管理するWebアプリケーションがあります。クライアント側にデータを保存する - 操作から保護する方法?

クライアントアプリケーションはIPC経由で別のプログラムから多くの異なる値を読み込みます。ソースコードがなく、私が読んでいる他のプログラムで何かを変更するオプションはありません。
私のアプリケーションは、それらの値を収集し、それらをローカルに格納します。なぜなら、Webアプリケーションに常に接続されているわけではないからです。

Webアプリケーションは統計情報を構築し、それらの値のうち多くをビルドするので、収集された値はプロジェクト全体にとって非常に重要なので、ユーザーはそれらを変更できません(少なくとも、クライアントのデータに100%のセキュリティを提供できないと確信しています)。

クライアントアプリケーションはC#で書かれていますが、WebアプリケーションはLaravel Framework(PHP)に基づいています。しかし、この質問は、これを正確に記述する方法よりも、理論に関するものです。

私の考え:
私は非対称暗号化を考えていました。クライアントは、Webアプリケーションサーバーの公開鍵でデータを暗号化します。データは暗号化されて保存されます。もちろん、クライアントはこの公開鍵を持っています。したがって、攻撃者は自分の操作した値を暗号化してファイルに格納するだけです。

もう1つは、データを暗号化するだけでなく、ファイル全体を暗号化するだけでなく、それほど明白ではない形式を使用することでした。しかし、これはあいまいさによる安全性のようなものであり、私が知る限り避けるべきです。さらに、クライアントアプリケーションを逆コンパイルして、すぐに私が使用しているフォーマットを持つことができます。

私の質問:
サーバにそのデータを送信するときに、私は整合性のまともなレベルを提供することができる任意の方法はありますか?もしそうなら、それはどうやって行えますか?

+0

できません。クライアントが触れることができるデータは、侵害されたとみなすことができます。 Laravelのバックエンドに達すると、データの整合性が保証されます。 – Andrew

+0

それは私が考えていたことです...しかし、悲しいことに、バックエンドはせいぜい妥当性チェックを行うことができます。この場合、Webアプリケーションは整合性を保証できません。あなたの提案をありがとう! – MrPixelDream

+1

Webサーバーに送信する前に、IPCデータの再検証を行うことができます。 – Crowcoder

答えて

1

あなたが行うことができる2つの事があります。

  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を使用してください。

関連する問題