12

重複の可能性:
一意のハードウェア ID を生成する信頼できる方法

特定のコンピューターに固有の ID を生成しようとしています。ID はランダムに生成されません。コンピューター A 用に生成された ID が固定され、コンピューター A に固有であるように、計算ベースになります。プログラムがコンピューター A で実行されるたびに、同じ ID が生成され続け、別のコンピューターで実行されると、次のように生成されます。そのコンピュータに固有の別の ID。これは、2 台のコンピューターが同じ ID を持たないようにするためです。

私の課題:私のプログラムがコンピューターに固有の ID を生成できるようにするには、それを実行するコンピューターに固有のシードに基づいて計算を実行する必要があります。

私の質問: ID 生成プログラムで値をシードとして使用できるように、コンピューターに固有の値を取得するにはどうすればよいですか?

そのコンピュータに固有のコンピュータのハードウェア (マザーボードなど) から値を取得することは可能ですか? そうすれば、コンピュータのマザーボードが交換されない限り、値が変わらない可能性が高くなります。

4

7 に答える 7

10

Macアドレス?これは (実用的な目的で)すべての NIC に固有であるため、ユーザーがデュアル ブートを行っている場合でも再現性が保証されます。確かに、カードを交換する人はまれですが、他の指標(ネットワーク カードは変更される可能性があるため、これだけを使用しないでください)と組み合わせると、まだ可能です。

どうやって手に入れますか?

public static byte[] getMACAddress() throws SocketException, UnknownHostException {
    InetAddress address = InetAddress.getLocalHost();
    NetworkInterface networkInterface = NetworkInterface.getByInetAddress(address);

    return networkInterface.getHardwareAddress();
}

文字列表現が必要な場合は、これを行います

for (int byteIndex = 0; byteIndex < macAddress.length; byteIndex++) {
    System.out.format("%02X%s", macAddress[byteIndex], (byteIndex < macAddress.length - 1) ? "-" : "");
}

( http://www.kodejava.org/examples/250.htmlに感謝)

注:コメントで述べたように、Mac アドレスはなりすましの可能性があります。しかし、これを行っているのは人口のごく一部であり、これを著作権侵害対策に使用しない限り、それは十分にユニークです.

于 2010-09-05T02:09:44.143 に答える
7

Win32 はコンピュータ SID を生成します。これは、WMI または Active Directory 経由で取得できるインストールごとに一意であると想定されていますが、これはプラットフォーム固有のものです。仮想アダプターはコンピューター間で同じ MAC アドレスを共有する傾向があるため、MAC アドレスを使用することもできます。

ただし、UUID (または GUID) は一意であることが保証されている 128 ビットの数値であり、実際には、複数のランダムなマシンで一意の識別子を生成するという問題を解決する目的で作成されました。ウィキペディアによると:

これらの数値を大局的に見ると、隕石に衝突する年間リスクは 170 億分の 1 の確率であると推定されます[25]。これは、確率が約 0.00000000006 (6 × 10−11) であることを意味します。 1 年に数十兆の UUID があり、1 つの重複があります。言い換えれば、次の 100 年間、毎秒 10 億の UUID を生成した後で初めて、複製が 1 つだけ作成される確率は約 50% になります。地球上のすべての人が 6 億の UUID を所有している場合、1 つの重複の確率は約 50% になります。

可能な組み合わせの総数は 2^128 (または 3 x 10^38) なので、私はそれを信じがちです。また、最新の UUID ジェネレーターのほとんどは、V1 アルゴリズム (つまり、MAC アドレスに基づくアルゴリズム) を使用しなくなりました。これは、GUID がいつ生成され、誰が生成したかを知ることができるため、セキュリティ上の問題と見なされているためです。 . Win32 の世界では、Win2K または NT 4 頃のセキュリティ パッチが、MAC の代わりに疑似乱数に基づくアルゴリズムの V4 バージョンを使用するように変更され、JVM は常に V3/V4 バージョンを使用してきました。

EDIT:JavaでUUIDを生成するために使用される方法は、java.util.UUIDクラスを介しています。

于 2010-09-05T02:53:03.593 に答える
1

これを行う簡単な方法は、イーサネット ハードウェアまたは「mac」アドレスを読み取ることです。

http://download.oracle.com/javase/6/docs/api/java/net/NetworkInterface.html#getHardwareAddress()

Mac アドレスは、時間の経過とともに再利用されるため、人々が考えるほど一意ではありません。しかし、1 つのアプリケーションまたはネットワークに 2 つの同一のアプリケーションまたはネットワークが存在する可能性は非常に低くなります。

于 2010-09-05T02:10:08.560 に答える
0

Intelチップを使用しているもう1つのオプションIFFは、機能が有効になっていることを確認できると仮定すると、プロセッサのシリアル番号です。詳細については、 Intel Serial#Noteを参照してください。

于 2010-09-05T02:26:56.553 に答える
0

最適なオプションは、ID をプライマリ ネットワーク アダプターの MAC アドレスに基づいて作成することです。

これはいつか変更される可能性がありますが、単一のハード コンポーネントも変更される可能性があります。

FYI GUID は、MAC アドレスを使用して計算されます。

于 2010-09-05T02:11:51.653 に答える
0

この記事に記載されている情報にアクセスできますか? Windows のみ

http://msdn.microsoft.com/en-us/library/aa394587.aspx

シリアル番号、資産タグ

于 2010-09-05T02:15:37.520 に答える
0

MACアドレスは、あなたにとって十分に一意です。http://en.wikipedia.org/wiki/MAC_addressを参照

使用している言語を指定しませんでした。一部の言語では、他の言語よりも簡単な場合があります。Java http://www.kodejava.org/examples/250.htmlでそれを行う方法は次のとおりです。あなたの言語をグーグルで調べてください。

于 2010-09-05T02:10:38.870 に答える