C# 如何在不同的平台上创建相同的MD5令牌?

C# 如何在不同的平台上创建相同的MD5令牌?,c#,android,ios,swift,hash,C#,Android,Ios,Swift,Hash,我第一次使用MD5哈希,我试图创建一个令牌来保护我的web服务。我发现Android、IOS和C#有三种不同的md5哈希方法。在调用任何Web服务之前,我创建一个令牌并将其作为参数发送。然后,当我在服务端获得令牌时,我也使用C#中相同的算法创建一个令牌,并比较这两个令牌。如果令牌相同,则我允许执行该过程。如果不是,我抛出一个例外。我的问题是,代币总是不同的。我认为md5创建方法的不同导致了这个问题 C代码中的MD5方法: public static string MD5(string strin

我第一次使用MD5哈希,我试图创建一个令牌来保护我的web服务。我发现Android、IOS和C#有三种不同的md5哈希方法。在调用任何Web服务之前,我创建一个令牌并将其作为参数发送。然后,当我在服务端获得令牌时,我也使用C#中相同的算法创建一个令牌,并比较这两个令牌。如果令牌相同,则我允许执行该过程。如果不是,我抛出一个例外。我的问题是,代币总是不同的。我认为md5创建方法的不同导致了这个问题

C代码中的MD5方法:

public static string MD5(string stringToEncrypted)
    {
        // step 1, calculate MD5 hash from input
        var md5 = System.Security.Cryptography.MD5.Create();
        byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(stringToEncrypted);
        byte[] hash = md5.ComputeHash(inputBytes);

        // step 2, convert byte array to hex string
        var sb = new StringBuilder();
        for (int i = 0; i < hash.Length; i++)
        {
            sb.Append(hash[i].ToString("X2"));
        }
        return sb.ToString();
    }
    extension String
    {
        var md5: String!
        {
           let str = self.cStringUsingEncoding(NSUTF8StringEncoding)
           let strLen = CC_LONG(self.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
           let digestLen = Int(CC_MD5_DIGEST_LENGTH)
           let result = UnsafeMutablePointer<CUnsignedChar>.alloc(digestLen)

           CC_MD5(str!, strLen, result)

           var hash = NSMutableString()
           for i in 0..<digestLen
           {
              hash.appendFormat("%02x", result[i])
           }

           result.destroy()

           return String(format: hash)
        }
    }
public static final String md5(final String stringToEncrypted) 
{
    final String MD5 = "MD5";
    try 
    {
        // Create MD5 Hash
        MessageDigest digest = java.security.MessageDigest.getInstance(MD5);
        digest.update(stringToEncrypted.getBytes());
        byte messageDigest[] = digest.digest();

        // Create Hex String
        StringBuilder hexString = new StringBuilder();
        for (byte aMessageDigest : messageDigest) 
        {
            String h = Integer.toHexString(0xFF & aMessageDigest);
            while (h.length() < 2)
                h = "0" + h;
            hexString.append(h);
        }
        return hexString.toString();
    } 
    catch (NoSuchAlgorithmException e) 
    {
        e.printStackTrace();
    }
    return "";
}
公共静态字符串MD5(字符串stringToEncrypted)
{
//步骤1,从输入计算MD5散列
var md5=System.Security.Cryptography.md5.Create();
byte[]inputBytes=System.Text.Encoding.ASCII.GetBytes(stringToEncrypted);
byte[]hash=md5.ComputeHash(inputBytes);
//步骤2,将字节数组转换为十六进制字符串
var sb=新的StringBuilder();
for(int i=0;i
在Swift代码中:

public static string MD5(string stringToEncrypted)
    {
        // step 1, calculate MD5 hash from input
        var md5 = System.Security.Cryptography.MD5.Create();
        byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(stringToEncrypted);
        byte[] hash = md5.ComputeHash(inputBytes);

        // step 2, convert byte array to hex string
        var sb = new StringBuilder();
        for (int i = 0; i < hash.Length; i++)
        {
            sb.Append(hash[i].ToString("X2"));
        }
        return sb.ToString();
    }
    extension String
    {
        var md5: String!
        {
           let str = self.cStringUsingEncoding(NSUTF8StringEncoding)
           let strLen = CC_LONG(self.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
           let digestLen = Int(CC_MD5_DIGEST_LENGTH)
           let result = UnsafeMutablePointer<CUnsignedChar>.alloc(digestLen)

           CC_MD5(str!, strLen, result)

           var hash = NSMutableString()
           for i in 0..<digestLen
           {
              hash.appendFormat("%02x", result[i])
           }

           result.destroy()

           return String(format: hash)
        }
    }
public static final String md5(final String stringToEncrypted) 
{
    final String MD5 = "MD5";
    try 
    {
        // Create MD5 Hash
        MessageDigest digest = java.security.MessageDigest.getInstance(MD5);
        digest.update(stringToEncrypted.getBytes());
        byte messageDigest[] = digest.digest();

        // Create Hex String
        StringBuilder hexString = new StringBuilder();
        for (byte aMessageDigest : messageDigest) 
        {
            String h = Integer.toHexString(0xFF & aMessageDigest);
            while (h.length() < 2)
                h = "0" + h;
            hexString.append(h);
        }
        return hexString.toString();
    } 
    catch (NoSuchAlgorithmException e) 
    {
        e.printStackTrace();
    }
    return "";
}
扩展字符串
{
var md5:String!
{
设str=self.cStringUsingEncoding(NSUTF8StringEncoding)
设strLen=CC_LONG(self.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
设digestLen=Int(CC\u MD5\u DIGEST\u长度)
let result=unsafemeutablepointer.alloc(digestLen)
CC_MD5(str!、strLen、result)
var hash=NSMutableString()
对于0中的i..代码示例

func doSha256(#dataIn:NSData)->NSData{
var shaOut:NSMutableData!=NSMutableData(长度:Int(CC_SHA256_DIGEST_length));
CC_SHA256(dataIn.bytes,CC_LONG(dataIn.length),UnsafeMutablePointer(shaOut.mutableBytes));
返回绍特;
}
显然,只需更改其他哈希方法的常量


如果您需要另一种格式,比如Base64或hex,请将这些转换放在调用此方法的包装器方法中。最好不要将方法混合在一起,允许每个方法执行一件事。(单一责任原则)它还允许更轻松的测试和调试。

您需要使用相同的编码。有没有解决此问题的方法,例如链接或教程?我搜索了很多,但找不到确切的解决方案。@SLaksMD5不安全,不应用于令牌身份验证。您对此有何建议?您有何想法“密码”方法?@magosHMAC(使用MD5作为散列算法)。查看了解更多信息。