2015-07-13 62 views
2

所以我一直在研究一個C#加密信使的樂趣,它有加密/解密序列,需要使用一個獨特的45個字符集。如何在2個用戶之間創建唯一的ID?

我創建了一些只是演示,加密工作。但目前我正在添加一個登錄系統。登錄後,您會看到一個人員列表,每個與您交談的人都將擁有唯一的對話ID。

所以基本上,我想找到一種方法來創建此對話ID,以便它對於您添加的每個用戶都是不同的,但對於其他用戶添加的用戶也是如此。

例如: 我添加鮑勃和會話ID是:R4ToGdKknnFKZNucj8xvpoP30vagfhtIdyrrLnQG

目前,如果鮑勃增加了我的ID會有所不同。但我試圖找到一種方法來使它在2個用戶之間相同,但在2個其他用戶之間不同。

如果任何人都可以提供幫助,那會很棒。我正在使用CodeProject提供的加密代碼,但爲我的需要進行了編輯。如果需要,我可以在這裏發佈代碼。我正在使用C#Windows窗體應用程序。

+2

你可以Concat的兩個都不會有問題用戶ID按字典順序排列,然後將其加密成對話ID – SimpleVar

+0

您使用什麼算法來生成對話ID(即,您是如何從您的Id和Bob中獲得'R4ToGdKknnFKZNucj8xvpoP30vagfhtIdyrrLnQG')? – Jamiec

+0

它看起來像你的應用程序需要服務器與數據庫。使用自己的id以及user1Id和user2Id創建名爲Conversation的實體... – Fabjan

回答

2

假設用戶名是一致的,唯一的,你可以將它們的一些字符串組合轉換成更適合作爲ID的格式(如BIGINT此過程創建):

string user1 = "daniel25"; 
string user2 = "kevin91"; 

var hashBuilder = new StringBuilder(); 
if (user1.CompareTo(user2) < 0) 
{ 
    hashBuilder.Append(user1); 
    hashBuilder.Append(user2); 
} 
else 
{ 
    hashBuilder.Append(user2); 
    hashBuilder.Append(user1); 
} 

var bytes = Encoding.Unicode.GetBytes(hashBuilder.ToString()); 
byte[] hashBytes; 

using (var hasher = SHA1.Create()) 
{ 
    hashBytes = hasher.ComputeHash(bytes); 
} 

long value = BitConverter.ToInt64(hashBytes, 12); 
var uniqueHash = IPAddress.HostToNetworkOrder(value); 

商店是ID爲在你的數據庫中有一個bigint,你有一個主鍵來引用兩個人之間的對話,並且很容易索引和查找。這個方法有一些限制(比如用戶「daniel25」和「kevin91」接收與「daniel」和「25kevin91」相同的哈希),但是我認爲如果你添加一個用戶名'separator'這是不允許用戶名字符。你可以採取hashBytes右轉入一個nvarchar場 -

var hashBuilder = new StringBuilder(); 
hashBuilder.Append(user1); 
hashBuilder.Append("@"); 
hashBuilder.Append(user2); 

另外,如果你想只用一個真正的散列無需轉換爲Int64

+0

完美。這正是我所尋找的,我可能會稍微改變一下,但由於它不需要超級安全的加密,這聽起來很棒。謝謝。 – pxgamer

+0

@PXgamer FYI我編輯包括亞歷克斯H的建議,排序用戶之前添加它們。這樣用戶的順序不會影響散列。 –

+0

Omg。這真是太棒了:P謝謝。我試圖解決這個問題,因爲當我更換用戶時,系統崩潰了。但現在它運作良好。謝謝你們。 – pxgamer

2

通常,兩個用戶都不知道對方的對話ID。如果它可以很容易地生成,那麼每個人都可以生成它,並且整個加密通過設計已經不安全。以下是一些example這是如何在客戶端/服務器通信中工作的:首先,RSA用於通信的非對稱加密以交換AES密鑰,該密鑰用於對稱加密。關鍵不是永久的,即使在相同的用戶之間,它也會隨着每次新的對話而改變。

+0

嗯,這是有道理的,因爲我不希望他們很容易被猜到,但不知道我怎麼能讓他們記錄相同的密鑰。到目前爲止,它不是真正的信使,更多的是解密/加密系統。 – pxgamer

2

除了克里斯舒伯特的答案: 當你添加string.CompareTo(string)你會得到相同的哈希每對。

當你比較值,你將不得不爲每個重複對完全相同的哈希:

if (user1.CompareTo(user2) < 0) 
{ 
    hashBuilder.Append(user1); 
    hashBuilder.Append(user2); 
} 
else 
{ 
    hashBuilder.Append(user2); 
    hashBuilder.Append(user1); 
} 

這樣,如果凱文爲user1或丹尼爾

+0

這是一個偉大的觀點 - 我會添加到我的答案。 –

相關問題