C # Создать Auth токен из Guid в сочетании с шестнадцатеричной строкой 40Char (UUID) - PullRequest
1 голос
/ 14 августа 2010

Я пишу приложение asp.net MVC, которое управляет приложением IPhone.

Я хочу, чтобы Iphone отправил мне свой UUID, выглядит следующим образом:

2b6f0cc904d137be2e1730235f5664094b831186

На сервере я хочу создать Guid:

466853EB-157D-4795-B4D4-32658D85A0E0

На Iphone и на сервере мне нужен простой аглоритм, чтобы объединить эти 2 значения в токен Auth, который можно передать. И IPhone, и приложение ASP.NET MVC должны иметь возможность вычислять значение снова и снова на основе UUID и GUID.

Так что это должен быть простой алгоритм без библиотек из .net framework.

Полное решение здесь

        public void Test()
        {    
            var DeviceId = Guid.NewGuid();
            var newId = "2b6f0cc904d137be2e1730235f5664094b831186";

            var guidBytes = DeviceId.ToByteArray();
            var iphoneBytes = StringToByteArray(newId);
            byte[] xor = new byte[guidBytes.Length];

            for (int i=0;i<guidBytes.Length;i++)
            {
                xor[i] = (byte) (guidBytes[i] ^ iphoneBytes[i]);
            }

            var result = ByteArrayToString(xor);               
        }

        public static byte[] StringToByteArray(String hex)
        {
            int NumberChars = hex.Length;
            byte[] bytes = new byte[NumberChars / 2];
            for (int i = 0; i < NumberChars; i += 2)
                bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
            return bytes;
        }

        public static string ByteArrayToString(byte[] ba)
        {
            StringBuilder hex = new StringBuilder(ba.Length * 2);
            foreach (byte b in ba)
                hex.AppendFormat("{0:x2}", b);
            return hex.ToString();
        }

Ответы [ 5 ]

2 голосов
/ 14 октября 2010

Так же, как примечание, все механизмы «токена авторизации», с которыми я работал (по крайней мере), объединяли постоянное значение («секрет») с текущим временем, затем хешировали их вместе, затем отправляли хэш и Дата. Затем сервер восстанавливает хэш на основе полученной даты и известного «секрета», а затем сравнивает его с полученным хешем (подписью). Моя точка зрения здесь была «объединена с датой» - это позволяет результирующей сигнатуре каждый раз отличаться, что в теории должно быть более надежным.

2 голосов
/ 14 августа 2010

Итак, идентификатор iPhone выглядит как шестнадцатеричная строка, поэтому преобразование как в двоичный, так и в XOR байтов должно сделать это. При необходимости вы можете сохранить результат в виде массива, шестнадцатеричной строки или строки в кодировке base-64.

Однако то, как вы называете это «токеном аутентификации», немного беспокоит. Идентификаторы сеанса должны быть непредсказуемыми. Вы можете подумать о создании массива криптографически случайных данных на сервере вместо GUID.

Редактировать

// Convert the server GUID to a byte array.
byte[] guidBytes = severGuid.ToByteArray();

// Convert the iPhone device ID to an array
byte[] idBytes = StringToByteArray(iPhoneId);

К сожалению, в .NET нет встроенного метода для преобразования в / из шестнадцатеричных строк, но этот вопрос уже рассматривался: Преобразование байтового массива в шестнадцатеричную строку и наоборот

// Once you've XORed the bytes, conver the result to a string.
string outputString = ByteArrayToString(outputBytes);
1 голос
/ 14 августа 2010

Вместо XORing, который теряет информацию, вы можете просто объединить эти шестнадцатеричные цифры.

0 голосов
/ 15 августа 2010

Я думал, что вы можете использовать двусторонний алгоритм. Это означает, что алгоритм может быть закодирован и декодирован как Base64, SHA256, AES

0 голосов
/ 15 августа 2010

Зачем вам вообще нужен GUID? Идентификатор телефона уникален, GUID, кажется, не добавляет значения.

...