我的项目中有一个CryptoSwift.framework将String转换为md5。结果哈希字符串用于在服务器端进行授权。因此,我发送到此服务器的所有请求都使用此功能,所有工作都正常,直到......
我从中收到了一个deviceToken对象 didRegisterForRemoteNotificationsWithDeviceToken方法。然后我将它转换为带有" toHexString"的字符串。功能。然后我随便将它传递给APIHelper(我的自定义类与服务器端进行交互)
APIHelper.register(deviceToken: deviceToken.toHexString())
这是一个围绕Alamofire请求方法的简单包装器,添加了一些自定义处理:
class func register(deviceToken: String)
{
request(.get, resource: FWWebRequests.registerToken, parameters: ["token": deviceToken]) { (object, result) in
print(object as Any)
print(result)
}
}
并且服务器的结果总是"无效的哈希字符串"。但是使用相同散列的其他方法也可以正常工作。所以问题是 - 这可能是一个哈希方法问题。如果不是 - 它能是什么?
答案 0 :(得分:2)
否算法 MD5无法产生错误的结果。 MD5使用伪随机值精确返回16个字节,这意味着输出不能(轻松)与随机区分开来。
现在通常存在的问题是MD5的输出(或任何其他加密函数)直接用作字符串。但是,完全随机的值可能与假定的编码不匹配(例如Windows-1252 / Latin或UTF-8)。这意味着在编码/解码过程中数据可能会丢失,从而导致字符串大小不同于16个字符/字节。
所以唯一可能错误的(除了为null)是长度不正确,或者哈希值本身(例如十六进制)的编码是错误的。这也可能是由于I / O问题(当然没有从插座中读取足够的数据等)。