2012-08-27 31 views
0

我想生成一個硬件散列,用於生成密鑰來加密文件,以便它不能與另一臺計算機交換。這不是一個許可證問題,它是從我們的在線數據庫中存儲一些數據的備份副本,以便應用程序可以脫機使用(但其中包含的數據相當安全,不會被窺探)。此前,我抓住的(真正)網絡適配器這樣的MAC地址:穩定硬件散列

ManagementClass mng = new ManagementClass("Win32_NetworkAdapter"); 
ManagementObjectCollection apts = mng.GetInstances(); 
IEnumerable<string> macs = from ManagementObject mo in apts 
          where mo["MacAddress"] != null && mo["NetConnectionStatus"] != null 
          select mo["MacAddress"].ToString(); 

這個工作相當不錯,但現在我有一個新的電腦我發現,當無線關閉,我得到兩個MAC地址(一個用於有線網卡,另一個用於無線網絡),當我打開無線網絡時,我有三個(前兩個,另外還有一個藍牙!),但我沒有看到任何明顯的方法來過濾掉藍牙(在NetConnectionID中搜索「Bluetooth」不足)。

現在我不需要超穩定的散列在這裏。如果哈希不匹配,那麼應用程序無法解碼加密的數據,並會在網絡上下載新的副本,所以這不是什麼大問題(如果您不在網絡中,它會只是告訴你它現在不可用)。但如果打開和關閉無線電足以改變我的散列,那麼它顯然不夠穩定!

所以我的問題:

1)是否有更好的方式來告訴大家,一個網絡適配器可能會突然消失,所以我可以從原來的哈希排除呢?

2)適配器的順序是否保證相同?列出的第一個適配器是否始終是有線網卡?如果是這種情況,也許我會限制它只使用第一個適配器。

3)我可以使用更好,更穩定的散列嗎?或者相當穩定的組合?

注意:我也從機器名稱Environment.MachineName到我的散列已經。

+0

生成一個隨機數並將其存儲在一個文件中。 –

+0

沒有關於該mac地址的真實情況,它所做的只是讀取註冊表。不穩定是令人不快的,安全漏洞是不可接受的。使用公鑰/私鑰或其他值得實際編碼的東西。 –

+0

@HansPassant:但是移動這兩個文件將允許它在另一臺計算機上工作,這是我試圖防止的情況。 –

回答

1

我不知道答案1或2,但這裏有一個潛在的解決方法:

您可以創建相結合的機器名,processorID,& motherboardID更穩定的哈希值。如果你只是使用它來進行本地識別,那麼應該足夠強大。 This CodePlex article有一個很好的硬件鍵列表。請讓我知道,如果你有任何問題。

+0

謝謝克里斯。我將其中的一些組合起來以產生合理穩定的散列。 –