如何在2个用户之间创建唯一ID?

时间:2015-07-13 09:12:55

标签: c# winforms encryption visual-studio-2013 messages

所以我一直在研究C#加密的信使,它有加密/解密序列,需要使用一个独特的45字符集。

我创建了一些演示,加密工作。但目前我正在添加一个登录系统。登录后,您会收到一个人员列表,与您通话的每个人都将拥有唯一的会话ID。

所以基本上,我想找到一种方法来创建这个会话ID,以便它对于你添加的每个用户都是不同的,但是如果另一个用户添加了你的话,那就相同了。

例如: 我添加了Bob,会话的ID是:R4ToGdKknnFKZNucj8xvpoP30vagfhtIdyrrLnQG

目前,如果Bob加我,则ID会有所不同。但我正试图找到一种方法,使两个用户之间的相同,但其他2个用户之间不同。

如果有人能提供帮助,那就太好了。我正在使用CodeProject提供的加密代码,但根据我的需要进行了编辑。如果需要,我可以在这里发布代码。我正在使用C#Windows窗体应用程序。

3 个答案:

答案 0 :(得分: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”相同的哈希),但我认为如果添加用户名“分隔符”,您可以解决它们不允许作为用户名字符。

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

此外,如果您只想使用真正的哈希,则无需转换为Int64 - 您可以将hashBytes直接带入nvarchar字段。

答案 1 :(得分:2)

通常,两个用户都不知道彼此的对话ID。如果它可以很容易地生成,那么每个人都可以生成它,并且整个加密在设计上已经是不安全的。以下是一些example在客户端/服务器通信中的工作原理:首先,RSA用于通信的非对称加密,以交换用于对称加密的AES密钥。密钥不是永久性的,即使在相同的用户之间也应该随着每个新对话而改变。

答案 2 :(得分:2)

除了Chris Schubert的答案: 当您添加string.CompareTo(string)时,您将获得每对的相同哈希值。

当您比较这些值时,每个重复对都将具有完全相同的哈希值:

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

这样,如果kevin是user1或daniel

,则无关紧要