我第一次使用MD5哈希,我正在尝试创建一个令牌来保护我的网络服务。我找到了三种不同的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();
}
在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”));
这些差异会导致这个问题吗?
感谢您的回答,
祝你好运
答案 0 :(得分:0)
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将这些转换放在调用此方法的包装器方法中。最好不要混合方法,让每个方法做一件事。 (单一责任原则)它还允许更容易的测试和调试。