所以我一直在研究C#加密的信使,它有加密/解密序列,需要使用一个独特的45字符集。
我创建了一些演示,加密工作。但目前我正在添加一个登录系统。登录后,您会收到一个人员列表,与您通话的每个人都将拥有唯一的会话ID。
所以基本上,我想找到一种方法来创建这个会话ID,以便它对于你添加的每个用户都是不同的,但是如果另一个用户添加了你的话,那就相同了。
例如: 我添加了Bob,会话的ID是:R4ToGdKknnFKZNucj8xvpoP30vagfhtIdyrrLnQG
目前,如果Bob加我,则ID会有所不同。但我正试图找到一种方法,使两个用户之间的相同,但其他2个用户之间不同。
如果有人能提供帮助,那就太好了。我正在使用CodeProject提供的加密代码,但根据我的需要进行了编辑。如果需要,我可以在这里发布代码。我正在使用C#Windows窗体应用程序。
答案 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
,则无关紧要