What is the best way to generate a unique hardware ID on Microsoft Windows with C++ that is not easily spoofable (with for example changing the MAC Address)?
6 に答える
Windows は、マシンごとに一意の Guid を次のレジストリに保存します。
HKEY_LOCAL_MACHINE\Software\Microsoft\Cryptography\MachineGuid
これは以前は CPU のシリアル番号でしたが、今日では多くの種類のマザーボードがあり、この要素は正確ではありません。MAC アドレスは簡単に偽造できます。これで、内蔵ハード ドライブのシリアル番号が残ります。参照: http://www.codeproject.com/Articles/319181/Haephrati-Searching-for-a-reliable-Hardware-ID
さまざまな「トリック」がありますが、本当の「物理的な答え」は「いいえ、解決策はありません」だけです。
「マシン」は、いくつかのハードウェアを備えたパッシブバスにすぎません。各鉄片は何らかの形で使用可能な識別子を提供できますが、すべての鉄片は、完全には認識できない悪い理由または正当な理由でユーザーによって置き換えられる可能性があります (したがって、これに基づいて機能を構築すると、問題が発生します。したがって、結果として、ハードウェアを交換/再初期化/再構成する必要があるたびに自分自身に.
ここで、多くのマシンが相互運用しなければならないコンテキストでマシンを識別することが問題である場合、これは MAC または IP アドレスまたはホスト名が適切に果たす役割です。ただし、それらは必ずしも長期間にわたって一定であるとは限らないという考えに備えてください(したがって、それらをハードコードすることは避けてください-代わりに、起動時に「発見」してください)
問題がソフトウェア インスタンスまたはライセンスの識別である場合は、おそらく別の種類のソリューションに集中する方がよいでしょう。ライセンスを「ユーザー」に販売します (お金を持っているのはユーザーであり、コンピューターではありません!)。 「マシン」ではなく(ハードウェアやOSのライセンスを取得していないため、ユーザーは必要なときにいつでも好きなときに自由に変更できる必要があります...)、したがって、問題はマシンを識別することではありませんが、ユーザー(同じマシンが多くのユーザーのホストになる可能性があり、同じユーザーがさまざまなマシンで作業できることを考慮してください...、何らかの問題にすぐに遭遇することなく、1:1の関係を想定/強制することはできません以降、このイディオムが適切でないと判断された場合)。
ある程度アクセス可能なサイトにユーザーを登録し、生成したキーをユーザーに提供し、同じユーザー/キーのペアが、特定の期間内に合意された回数を超えて同時に使用されていないことを確認する必要があります。違反が超過した場合、またはキーが古くなった場合は、ブロックしてユーザーが更新するのを待ちます。
ご覧のとおり、答えは、質問自体よりも、質問の背後にある理由に大きく依存します。
ハードウェアにはさまざまな ID が割り当てられており、それらを読み取って組み合わせてマシン キーを形成できます。たとえば、ソフトウェアが保存されているハード ドライブの ID や proc ID などを取得できます。これらの中には、他のものよりも簡単に設定できるものもありますが、強みの一部は、必ずしもそうではない複数の部分を組み合わせることにあります。単体でも十分強い。
これは、コンピューター/ハードウェア ID を読み取って表示できるプログラム ( DLLとしても入手可能) です: http://www.soft.tahionic.com/download-hdd_id/index.html