3

Microsoft の LicenseProvider を使用して、しっかりしたライセンス スキームを見つけようとしています。私の考えは、RSA(2048ビットキーのRSACryptoServiceProvider)による非同期暗号化を使用することです。これは非常に簡単であることがわかりましたが、メカニズムが実際にどれほど安全かはわかりません. これは楽しみのためではなく、米国内の多くの製品 (約 100 のインストールについて話している) をコピー プロテクトする必要があります。有効期限は不要です。

ここで、秘密キーを使用してライセンス ファイル (.lic) を暗号化します。顧客のコンピューターでは、ライセンス マネージャーがコンピューターの一意の ID を実行時に .lic ファイルに格納されている一意の ID と照合します。製品には対応する公開鍵があるため、ファイルを復号化できます。ID が一致すると、ライセンスは有効になり、プログラムが開始されます。

(ところで、コンピュータ ID は、MAC アドレス + CPU シリアル + ハード ドライブ シリアルの組み合わせです。したがって、これらのいずれかが変更された場合、ライセンスを更新する必要があります)。

それはとても簡単ですか?.lic ファイルを復号化できたとしても、必要な秘密鍵がないため、再度暗号化することはできません。

さて、高価なサード パーティ ソリューションを購入し、ライセンス DLL をクラッキングして回避する以外に、RSA+computerID を使用するこのアイデアはどの程度安全だと思いますか?

(はい、これを改善するためにコードを難読化することを検討しています)

フィードバックをお寄せいただきありがとうございます!

4

3 に答える 3

3

コードを難読化するかどうかに関係なく、要点は、その手法は安全ではなく、破られる可能性があるということです。製品のライセンス スキームは、難読化と同じくらい安全です。

RSA を使用して一意の ID またはライセンス ファイルを暗号化するのではなく、RSA を使用してモジュール、アセンブリ、またはクラス ライブラリを暗号化し、必須のコア コンポーネントまたは購入したフル バージョンでのみ利用したい特定の主要な機能を使用することを検討してください。こうすれば、適切なライセンスがなければ、フル バージョンの機能やアプリケーションのコア ロジックは存在しません。フル バージョンのエントリ ポイントである「ライセンスされた」ソフトウェアへの JMP 命令によって、ハードワークのすべてが盗まれることはありません。

基本的に、この概念の最も基本的な実装は、購入後に受け取る「ライセンス」を作成し、暗号化されたモジュール/アセンブリを復号化するための公開鍵をプログラムに貼り付けることです。ただし、1 人のユーザーが「ライセンス」を購入し、それを自分のすべての人に譲渡したり、自分のブログに投稿したりする可能性があるため、これを行うことは望ましくありません。少なくとも、フル バージョンの機能を解読するキーは、別のキーを使用して暗号化し、ソフトウェアのすべてのコピーに含める必要があります。「ライセンス」は、保護されたソフトウェアの復号化を行う実際の鍵を復号化する公開鍵になります。このようにして、ライセンスの複数のバージョンを保持したり、人気のあるすべての連載 Web サイトに投稿された場​​合にライセンスを変更したりできます。

さらに、ライセンスを暗号化する「ライセンス」は、支払い処理中にサーバーに提供されるコンピュータの「一意の ID」で単純にハッシュまたは対称的に暗号化されます。このようにして、そのコンピューターだけが適切な「パスフレーズ」を生成できます。必要に応じて、キーを復元してキーを解読し、プログラム/dll/whathaveyou を解読できます。

理想的には、モジュールを保護されたメモリ空間に復号化し、他のアプリケーションから読み取ることができず、ディスクにページングされず、メモリから実行され、処理が完了するとすぐに上書きされます。確かに、このテクニックは確実ではなく、決心したリバース エンジニアは、再配布のために復号化されたモジュールを取得する可能性があります。

他のアイデアには、コア機能または主要なデータ構造をコンパイル済みの機械語または中間言語として暗号化し、サーバーのどこかに保存することが含まれます。これらは、機能の実行が必要になるたびにサーバーからその情報を取得するために検証に合格する必要があり、復号化されます。保護されたメモリに直接、そこから実行されますが、そのような高度なレベルはほとんど必要なく、関連する複雑さのレベルに対して多くの追加セキュリティを提供しません.

考えさせられることがいくつかあったと思います。すべてが復号化され、ユーザーがコピーできるようになると、ユーザーが作成するコピーの数を制御できなくなるため、アプリケーションが実行されていないときに一部のコンポーネントを暗号化しておくことをお勧めします。

于 2013-01-16T00:03:53.010 に答える
1

明確にするために(参照している可能性があります)、[provider] .SignData([params])を使用してデータに署名し、ライセンスを検証するには[provider] .VerifyData([params])を使用する必要があります。また、作成したキーペアから秘密キーを削除することも忘れないでください。

于 2010-07-07T11:46:55.747 に答える
1

私は同じタイプのソリューションを持っています。ただし、コードを難読化しても、再設計やハッキングを防ぐことはできず、再設計されたコードを理解する作業がはるかに困難になるだけです。難読化は、このプロセスの重要なステップです。難読化を行わないと、コードをリバース エンジニアリングし、セキュリティ メソッドを見つけて、成功した結果を返させるだけで済みます (つまり、ハッカーが暗号化キーをクラックするために何か月も費やす必要はありません)。バイパスするだけです)。

于 2010-07-02T06:44:18.630 に答える