2015-07-13 5 views
2

Итак, я работал над зашифрованным мессенджером C# для удовольствия, и у него есть последовательность шифрования/дешифрования, которая должна использовать уникальный набор символов из 45 символов.Как создать уникальный идентификатор между двумя пользователями?

Я создал некоторые как демонстрации, и шифрование работает. Но в настоящее время я добавляю систему входа. При входе в систему вы получаете список людей, и каждый человек, с которым вы разговариваете, будет иметь уникальный идентификатор беседы.

Так что, в основном, я хочу найти способ создания этого идентификатора беседы, чтобы он отличался для каждого используемого вами использования, но то же самое, если другой пользователь добавляет вас.

Например: добавить Боб и идентификатор для разговора: R4ToGdKknnFKZNucj8xvpoP30vagfhtIdyrrLnQG

В настоящее время, если Боб добавляет меня, идентификатор будет отличаться. Но я пытаюсь найти способ сделать это одинаковым между двумя пользователями, но отличается между двумя другими пользователями.

Если кто-нибудь может помочь, это было бы здорово. Я использую код шифрования, предоставляемый CodeProject, но отредактированный для моих нужд. Если нужно, я могу опубликовать код здесь. Я использую приложение Windows Form C#.

+2

Вы можете Concat два идентификатор пользователя в лексикографическом порядке, а затем зашифровать его в идентификатор беседы. – SimpleVar

+0

. Какой алгоритм вы использовали для создания идентификатора беседы для начала (т. е. как вы получили «R4ToGdKknnFKZNucj8xvpoP30vagfhtIdyrrLnQG» от вашего ИД и Боба)? – Jamiec

+0

Похоже, для вашего приложения требуется сервер с базой данных. Создайте сущность с именем «Разговор со своим собственным идентификатором, а также user1Id и user2Id ... – Fabjan

ответ

2

Предполагая, что имена пользователей последовательны и уникальны, вы можете преобразовать некоторые строки их сочетание в формат более подходящим в качестве идентификатора (например, 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' что недопустимо как символ имени пользователя.

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

Кроме того, нет необходимости для преобразования в Int64, если вы хотите просто использовать настоящий хэш - вы можете взять hashBytes прямо в NVARCHAR поле.

+0

Отлично. Это именно то, что я искал, я могу немного поменять его, чтобы не повредить, но поскольку это не должно быть супер безопасное шифрование, это звучит здорово. Спасибо. – pxgamer

+0

@PXgamer FYI Я отредактировал, чтобы включить предложение Alex H по сортировке пользователей перед их добавлением. Таким образом, порядок пользователя не повлияет на хэш. –

+0

Omg. Теперь это блестяще: P Спасибо. Я пытался разобраться, как когда я сменил пользователя, система сломалась. Но теперь он отлично работает. Спасибо вам всем. – pxgamer

2

Обычно оба пользователя не знают друг друга. Если бы он мог быть сгенерирован легко, то каждый мог бы сгенерировать его, и все шифрование уже небезопасно по дизайну. Вот некоторые из них: 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

Это отличный момент - я добавлю к своему ответу. –

Смежные вопросы