代码之家  ›  专栏  ›  技术社区  ›  Chris Kooken

C从结合了40char十六进制字符串(UUID)的guid创建身份验证令牌

  •  1
  • Chris Kooken  · 技术社区  · 14 年前

    我正在写一个驱动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();
            }
    
    5 回复  |  直到 14 年前
        1
  •  2
  •   Community CDub    8 年前

    嗯,iphone id看起来像一个十六进制字符串,所以将其转换为二进制和异或字节应该可以做到这一点。您可以根据需要将结果存储为数组、十六进制字符串或base-64编码字符串。

    然而,您将其称为“认证令牌”的方式有点令人担忧。会话ID必须是不可预测的。您可以考虑在服务器上生成一个加密随机数据数组,而不是一个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没有内置的方法来转换十六进制字符串,但之前已经讨论过这个主题: Convert byte array to hex string and vice versa

    // Once you've XORed the bytes, conver the result to a string.
    string outputString = ByteArrayToString(outputBytes);
    
        2
  •  2
  •   Cristian Vrabie    14 年前

    正如附带说明,我使用的所有“auth-token”机制(至少)都将一个常量值(一个“秘密”)与当前时间连接起来,然后将它们散列在一起,然后发送散列和日期。然后,服务器从接收日期和已知的“秘密”重新构造散列,然后将其与接收的散列(签名)进行比较。 我这里的观点是“与日期连接”——这使得每次生成的签名都不同,理论上这应该更安全。

        3
  •  1
  •   Steven Sudit    14 年前

    您可以将这些十六进制数字连接起来,而不是丢失信息的XORING。

        4
  •  0
  •   Doobi    14 年前

    为什么你甚至需要guid?电话ID是唯一的,guid似乎没有添加值。

        5
  •  0
  •   noneno    14 年前

    我想你可以用双向算法。这意味着该算法可以像base64、sha256、aes那样进行编码和解码。