2015-07-13 58 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

这是一个伟大的观点 - 我会添加到我的答案。 –

相关问题