0

一部のユーザーが、サーバーレスで作成されたバックエンドから返される応答を変更してチートする可能性が高い iOS ゲームを設計しています (MITM 偽の証明書を介して)。これをある程度防ぐために、わかりにくい署名を含めたいと考えています。この実装はすべて完了しました (サーバーレス オフラインで作業しましたが、API ゲートウェイの制限により、Lambda から未加工の JSON を返すのに苦労しています。確認するには、JSON のスナップショットを取得できる必要があります)チェックサムを取得するとき、文字列化されたバージョンが同じ順序であること. そうしないと、オブジェクトにインフレートされる前に既に文字列である iOS 側で異なる方法で計算される可能性があります.

文字列を返し、API Gateway をエスケープさせない方法はありますか?

例えば:

 callback(null, flattened_json_string);

文字列を返すことができるため、Serverless-Offline で正しい応答が得られます。API-Gateway で実際にホストされると、次のようなエスケープが得られます。

"{\"metadata\":{\"cmKey\":\"537d1a54916e56bac1d03478b18575e8c0c74d86\",\"cacheReady\":true,\"serverTime\":1467433541108},\"commands\":[]}"

このようなブロックを渡す方法は知っていますが、解析して再文字列化して、チェックサムが原因で順序が変わるリスクを冒したくありません。

また、オブジェクトのハッシュを取得するための優れた JavaScript フレームワークがあることも認識していますが、これは明らかに iOS のクライアント側では利用できません。

4

2 に答える 2

1

これを書いている時点で、著者は自分自身の質問に答えていますが、ソリューションの長期的な安定性に影響を与えるいくつかの問題があります。

正しい解決策は、オブジェクトをエンコードする前またはデコードした後にキーを (通常は字句順に) ソートし、正規データのハッシュ (または、より適切には HMAC?) を組み立てることです。つまり、キーと値をソートします。これにより、署名と検証が真に決定論的になります。

何かを機能させるために間違ったコンテンツ タイプを使用することは、少し大雑把で壊れやすいように思えます。

また、特定の証明書がアプリケーション サーバーによって提示されることを期待することで、問題を完全に排除できるはずです (ある意味での証明書ピンニング)。その場合、MITM プロキシと偽造された SSL 証明書を持つ悪意のあるユーザーは、計算上非現実的な時間をアプリケーション サーバーになりすますことになります。

JSON Web トークンも有望に見えますが、おそらく質問の制約の範囲内ではありません.

于 2016-07-02T16:49:31.067 に答える
0

数時間の作業の後、修正は実際にはかなり簡単でした. 応答タイプを text/html に変更してから、返す前に文字列化する必要がありました。

サーバーレスでは、次のように設定します

"responseTemplates": {
        "text/plain": "$input.path('$')"
      }

私のコードでは:

callback(null, JSON.stringify(data));
于 2016-07-02T05:16:44.143 に答える