C#根据Guid和40Char十六进制字符串(UUID)创建身份验证令牌

C#根据Guid和40Char十六进制字符串(UUID)创建身份验证令牌,c#,iphone,asp.net-mvc,algorithm,guid,C#,Iphone,Asp.net Mvc,Algorithm,Guid,我正在编写一个驱动IPhone应用程序的asp.net MVC应用程序 我希望Iphone向我发送其UUID,如下所示: 2b6f0cc904d137be2e1730235f5664094b831186 在服务器上,我要生成Guid: 466853EB-157D-4795-B4D4-32658D85A0E0 在Iphone和服务器上,我都需要一个简单的算法将这两个值组合成一个可以传递的身份验证令牌。IPhone和ASP.NET MVC应用程序都需要能够根据UUID和GUID反复计算值 所以这需

我正在编写一个驱动IPhone应用程序的asp.net MVC应用程序

我希望Iphone向我发送其UUID,如下所示:

2b6f0cc904d137be2e1730235f5664094b831186

在服务器上,我要生成Guid:

466853EB-157D-4795-B4D4-32658D85A0E0
在Iphone和服务器上,我都需要一个简单的算法将这两个值组合成一个可以传递的身份验证令牌。IPhone和ASP.NET MVC应用程序都需要能够根据UUID和GUID反复计算值

所以这需要是一个简单的算法,没有.net框架中的库

这里有完整的解决方案

        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();
        }
公共无效测试()
{    
var DeviceId=Guid.NewGuid();
var newId=“2b6f0cc904d137be2e1730235f5664094b831186”;
var guidBytes=DeviceId.ToByteArray();
var iphoneBytes=StringToByteArray(newId);
byte[]xor=新字节[guidBytes.Length];

对于(int i=0;i嗯,iPhone ID看起来像一个十六进制字符串,因此将其转换为二进制并对字节进行异或运算应该可以做到。您可以根据需要将结果存储为数组、十六进制字符串或base-64编码字符串

您称之为“AuthTog”的方式有点担心。会话ID必须是不可预测的。您可以考虑在服务器上生成一组加密的随机数据,而不是GUID。< /P> 编辑

// 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似乎没有一个内置的方法来转换十六进制字符串,但是这个主题以前已经讨论过了:


嗯,iPhone ID看起来像一个十六进制字符串,因此将其转换为二进制并对字节进行XORing应该可以做到这一点。您可以根据需要将结果存储为数组、十六进制字符串或base-64编码字符串

您称之为“AuthTog”的方式有点担心。会话ID必须是不可预测的。您可以考虑在服务器上生成一组加密的随机数据,而不是GUID。< /P> 编辑

// 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似乎没有一个内置的方法来转换十六进制字符串,但是这个主题以前已经讨论过了:


与丢失信息的XORing不同,您可以连接这些十六进制数字。

与丢失信息的XORing不同,您可以连接这些十六进制数字。

为什么您甚至需要GUID?电话ID是唯一的,GUID似乎没有增加任何值。

为什么您甚至需要GUID?电话ID是唯一的,GUID似乎没有增加任何价值。

我想你可以使用双向算法。这意味着算法可以像Base64、SHA256、AES那样进行编码和解码。我想你可以使用双向算法。这意味着算法可以像Base64、SHA256、AES那样进行编码和解码。

作为旁注,我使用过的所有“身份验证令牌”机制(至少)将一个常量值(一个“秘密”)与当前时间连接起来,然后将它们散列在一起,然后发送散列和日期。然后,服务器根据收到的日期和已知的“秘密”重建散列,然后与收到的散列(签名)进行比较。
我在这里的观点是“与日期连接”-这允许每次生成的签名都不同,理论上应该更安全。

作为旁注,我使用过的所有“身份验证令牌”机制(至少)都连接了一个常量值(“秘密”)使用当前时间,然后将它们散列在一起,然后发送散列和日期。然后,服务器根据收到的日期和已知的“机密”重构散列,然后与收到的散列(签名)进行比较。
我的观点是“与日期连接”-这使得每次生成的签名都不同,理论上应该更安全。

我添加了安全层。。这实际上只是通过握手来识别客户端。你能给我一个C#的例子吗?什么的例子?将值Xor在一起?是的。请…我知道如何Xor^,但我需要帮助完成所有的操作版本。我添加了一个如何进行转换的示例。我添加了安全层。这实际上只是通过握手来识别客户端。你能给我一个C#的示例吗?一个什么的示例?将值Xor在一起?是的。请…我知道如何进行Xor^,但我需要帮助进行所有转换。我添加了一个如何进行转换的示例Xor'ing不会丢失数据,它是完全可逆的轻量级加密,但是对于串联,+1:)@Doobi:我不知道你的意思。64位的信息比2个32位字符串的XOR要多。除非你已经知道其中一个32位字符串,否则它是不可逆的。XOR’ing不会丢失数据,它是完全可逆的轻量级加密,但串联时+1:)@杜比:我不知道你的意思。64位的信息比2个32位字符串的异或信息要多。除非你已经知道其中的一个32位字符串,否则这是不可逆的。因为这个ID可以被嗅探和伪造。我需要一个ID,它只会持续会话的生命周期,并且是通过组合服务器上的会话Guid构建的,而h持续20分钟,UUID。因为该ID可以被嗅探和欺骗。我需要一个ID,该ID仅持续会话的生命周期,并通过将服务器的会话Guid(持续20分钟)与UUID组合而成。