私は、オンライン チェス バリアント ゲームを開発しています。プレーヤーに代わって、移動に費やされた正確な時間をサーバーに通信する目的を持つ JavaScript 関数を作成したいと考えています。
もちろん、このメッセージは暗号化されますが、この機能を信頼するために、難読化アルゴリズムを信頼できるところまで難読化したいと考えています。
私が知っている難読化アルゴリズムはいくつかしかありませんが、最も興味深いのは象形文字です。しかし、壊れないわけではありません。実行速度とサイズは重要ではありません。同じ関数でメッセージを送信する関数によって費やされた時間を差し引くことができ、サイズは最大 2MB になることもあります。
ブラウザで実行する必要がある限り、十分な忍耐力があれば誰でもそれを少しずつ取り、それが何をするかを見ることができるので、壊れないアルゴリズムはないと確信しています。
悪意のあるユーザーからのより多くの労力と時間を必要とする代替手段はありますか?
編集WindowsXP のすべてのブラウザーでいくつかのテストを行ったところ、FF、IE、Opera、および Chrome では、遅延中のシステム時間の変更に関係なくsetTimeout
、2 番目のパラメーターとして渡された遅延の後に関数がトリガーされるようです。他に示唆する情報が他にない場合、論理的な結論は、setTimeout 遅延によって指定される精度まで、Date() オブジェクトではなく setTimeout 関数を使用して、システム時間の変更に関係なく、クライアント側で時間を測定できるということです。時間。
ハミッシュは、以下の回答で、ブラウザーの日付/時刻 API の変更は簡単であると述べています。その場合、javascript コードは、setTimeout の実際の遅延時間を増加させる変更に対して脆弱です。サーバーが不合理な遅延時間を持つ誰かをだましている疑いを開始するように、いくつかのコードを設定する必要があります。ラグタイムが思考時間に含まれていない場合、これは常に問題になります。
サーバー側のタイミングを使用できないのには理由があります。ラグ タイムが妥当な量を超える場合があり、ユーザーは不満を抱くでしょう。また、ラグがすべての違いを生むこともあります。
元の質問に戻ります。最適な難読化方法を探しています。最適な方法は、攻撃者が難読化を解除するために必要な労力で測定されます。理想的には、攻撃者が難読化を解除できるよりも速く難読化アルゴリズムを変更し、そのアルゴリズムを二度と使用しないか、攻撃者が予期しない時間にめったに使用しないようにしたいと考えています。