web-dev-qa-db-ja.com

一意のハードウェアIDを生成する信頼できる方法

質問:次のようなネットワーク接続されたクライアントごとに一意のIDを考え出す必要があります。

  • クライアントコンピュータがターゲットコンピュータにインストールされると、それ(ID)は存続し、同じコンピュータおよび同じOSにソフトウェアが再インストールされても存続します。
  • ハードウェア構成がほとんどの方法で変更されている場合は変更しないでください(マザーボードの変更を除く)
  • クライアントソフトウェアがインストールされたハードドライブを、同じハードウェア構成(または可能な限り同様)の別のコンピューターに複製する場合、クライアントソフトウェアはその変更を認識している必要があります。

説明と裏話:

この問題は基本的に古くからある質問であり、ソフトウェアのコピー防止のトピックにも触れています。その領域で使用されているメカニズムの一部がここで説明されているためです。この時点で、私はコピー防止スキームを探しているわけではないことを明確にする必要があります。読んでください。 :)

ローカルネットワークで動作するはずのクライアントサーバーソフトウェアを使用しています。私が解決しなければならない問題の1つは、ネットワーク内の一意の各クライアントを特定することで(それほど問題ではありません)、特定の属性をすべての特定のクライアントに適用し、特定のデプロイメントのライフタイム中にそれらの属性を保持および適用できますクライアント。

解決策を探していたとき、私は次のことを認識していました。

  • Windowsアクティベーションシステムは、ハードウェアの変更に非常に敏感なある種の重いフィンガープリントメカニズムを使用します。
  • ディスクイメージングソフトウェアは、すべてのボリュームID(フォーマット時に各パーティションに関連付けられる)に沿ってコピーし、インストールプロセス、初回実行時、またはその他の方法で一意に生成されたカスタムのIDをコピーします。これは、本質的にソフトウェアであり、レジストリまたはハードドライブ上で、2つを混同するのは非常に簡単です。

この種類の問題の明らかな選択は、BIOS識別子を見つけることです(ただし、これが同一のマザーボードモデルを通じて一意であるかどうかは100%確実ではありません)。これは、複製によって転送されず、複製によって転送される唯一の方法です。 、そしてそれを変更することはできません(少なくともいくつかのユーザースペースプログラムを使用することによっては)。それ以外のすべては、信頼性がない(MACのクローン作成など)、または要求が厳しすぎる(構成の変更に敏感すぎる)ために失敗します。

私が聞きたいサブ質問は、私はそれを正しく行っているのですか、アーキテクチャ的にですか?多分私が達成しなければならないタスクのためのより良いツールがあります...

私が考えていた別のアプローチは、ハンドシェイクメカニズムに似たものです。サーバーは、接続されたクライアントIDの内部ルックアップテーブルを維持し(特定の時点では完全にソフトウェアベースで一意ではない場合もあります)、クライアントに次のように伝えます。接続時に重複したIDが提供された場合、ハンドシェイク中に別のIDを考え出します。残念ながら、このアプローチは、存続期間中に属性を特定のクライアントに結び付けるための要件の1つではうまく機能しません。

31
mr.b

自分の要件に対応する一意のIDを作成する必要があるようです。このIDは、重要な情報(ソフトウェアおよびハードウェアコンポーネントに関する情報)からハッシュ(MD5、SHA1、SHA512など)として作成できます。

このようなハッシュに秘密鍵で署名し、ソフトウェアが起動時に鍵(signed hash value)が署名されていることを確認すると、ソリューションをより安全にすることができます(公開鍵のみを一緒にインストールする必要があります)ソフトウェア)。さまざまなオンラインサービスでそのような種類のソリューションを拡張することはできますが、企業のクライアントはオンラインサービスをそれほどうまく見つけることができません。

7
Oleg

あなたが探しているのは Windows WMI です。マザーボードID(isは、同じタイプのマザーボード全体で一意)または他の多くのタイプの一意の識別子を取得して、巧妙なシードを作成できますUHIDを生成する関数。おっと私は頭字語を作っただけですか?

また、マザーボード(BIOS)IDを取得するために特に探している場合:

WMI class: Win32_BIOS
Namespace: \Root\Cimv2

ドキュメント: http://msdn.Microsoft.com/en-us/library/aa394077(VS.85).aspx
サンプルコード: http://msdn.Microsoft.com/en-us/library/aa390423%28VS.85%29.aspx

Edit:言語を指定しなかった(そして私はC++を想定した)が、これはJava (COMドライバーを使用)、および.NET言語も同様です。

7
David Titarenco

多くのプログラムは、(FlexLMに基づくもののような)ライセンスコードを構築するためにhostIdを使用します。手術システムに応じてMatlabが何をするかを見てください:

http://www.mathworks.com/support/solutions/en/data/1-171PI/index.html

この質問も見てください:

nixのようなシステムから一意のIDを取得する

ハードドライブのシリアル番号に基づいてライセンスを取得しているプログラムもいくつか見ましたが、おそらくそれが変更される可能性はほとんどありません。イーサネットカードのMACの使用を提案する人もいますが、これは再プログラムできます。

4
SystematicFrank

[〜#〜] mac [〜#〜]
MACに依存しないでください!これまで。それは永続的ではありません。ユーザーは簡単に変更できます( 秒未満 )。

ボリュームID
ボリュームIDに依存しないでください!これまで。それは永続的ではありません。ユーザーは簡単に変更できます。ドライブをフォーマットするだけでも変化します。

[〜#〜] wmi [〜#〜]
WMIはサービスです。簡単に無効にすることができます。実際、私はそれを試してみましたが、多くのコンピュータで無効になっているか壊れている(はい、かなり頻繁に壊れています)ことがわかりました。

ライセンスサーバー
検証サーバーへの接続は、次の理由から多くのトラブルを引き起こす可能性があります。
*顧客が常にインターネットに接続しているとは限りません。
*顧客は、検証サーバーに接続するためにプログラムに入力する必要がある特別な設定(ルーター/ NAT /プロキシ/ゲートウェイ)で接続する場合があります。
*それらはファイアウォールの背後にある可能性があり、いくつか(私の場合)を除くすべてのプログラムをブロックします。場合によっては、ファイアウォールが制御されないことがあります(ほとんどの企業ユーザーに有効)。
*ライセンスサーバーをエミュレートするローカルの偽のWebサーバーにプログラムをリダイレクトするのは 超簡単 です。

ハードウェアデータ
強力な保護が必要な場合は、ハードウェアに依存する必要があります。ユーザーが編集できないもの。 Intel/AMD CPUで利用可能なCPU ID命令やドライブのIDEインターフェイスに書き込まれたシリアル番号など。
CPU IDとHDD IDは永続的です。コンピュータをフォーマットしてWindowsを再インストールした後でも、変更されることはありません。

実行可能です。たとえば this library は、コンピューターのハードウェアIDを読み取ります。コンパイルされたデモとソースコード/ [〜#〜] dll [〜#〜] があります。免責事項:リンクは商用製品につながります(19€/ロイヤリティなし)。

1
WeGoToMars