c# - 如何在不同平台创建相同的 MD5 token ?

标签 c# android ios swift hash

我是第一次使用 MD5 哈希,我正在尝试创建一个 token 来保护我的网络服务。我已经为 Android、IOS 和 C# 找到了三种不同的 md5 哈希方法。在我调用任何网络服务之前,我创建了一个 token 并将其作为参数发送。然后,当我在服务端获得 token 时,我也在 C# 中使用相同的算法创建一个 token 并比较这两个 token 。如果 token 相同,我允许该过程。如果没有,我会抛出异常。我的问题是, token 总是不同的。我想是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();
    }

在 Swift 代码中:

    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)
        }
    }

在 Android 代码中:

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 "";
}

在 Android 中使用: h = "0"+ h;

在 IOS 中使用: hash.appendFormat("%02x", result[i])

在 C# 中使用: sb.Append(hash[i].ToString("X2"));

这些差异会导致这个问题吗?

感谢您的回答,

最好的问候

最佳答案

来自 SO Answer 的代码示例

func doSha256(#dataIn:NSData) -> NSData {
    var shaOut: NSMutableData! = NSMutableData(length: Int(CC_SHA256_DIGEST_LENGTH));
    CC_SHA256(dataIn.bytes, CC_LONG(dataIn.length), UnsafeMutablePointer<UInt8>(shaOut.mutableBytes));

    return shaOut;
}

显然只需更改其他哈希方法的常量即可。

如果您需要其他格式,例如 Base64 或 hex,请将这些转换放在调用此方法的包装器方法中。最好不要混合方法,让每个方法做一件事情。 (单一职责原则)它还允许更容易的测试和调试。

关于c# - 如何在不同平台创建相同的 MD5 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27605138/

相关文章:

android - 如何解决 "Failed to find provider info for com.my.package.urbanairship.provider"?

ios - 正则表达式获取给定单词集之前和之后的所有子字符串

objective-c - 应用程序更新,将旧数据库数据转换为新数据库

javascript - 使用 Cordova iOS 显示联系人的所有信息

c# - MEF - 如果一个插件失败则修改执行

c# - 队列实现文件监控并将它们发送到Web服务

c# - 当 UnsetValue 中有一个转换值时,使用 convertback 的多重绑定(bind)不起作用

c# - WPF DataGrid 移动到最后选定的行而不突出显示最近单击的行

java - 操作栏 Sherlock 4 标题文本颜色 - 我哪里出错了?

android - 从 Google Play 控制台项目中删除我的开发帐户