md5可以返回无效结果吗?

时间:2016-11-30 09:33:18

标签: swift cryptography swift3

我的项目中有一个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)
        }
    }

并且服务器的结果总是"无效的哈希字符串"。但是使用相同散列的其他方法也可以正常工作。所以问题是 - 这可能是一个哈希方法问题。如果不是 - 它能是什么?

1 个答案:

答案 0 :(得分:2)

算法 MD5无法产生错误的结果。 MD5使用伪随机值精确返回16个字节,这意味着输出不能(轻松)与随机区分开来。

现在通常存在的问题是MD5的输出(或任何其他加密函数)直接用作字符串。但是,完全随机的值可能与假定的编码不匹配(例如Windows-1252 / Latin或UTF-8)。这意味着在编码/解码过程中数据可能会丢失,从而导致字符串大小不同于16个字符/字节。

所以唯一可能错误的(除了为null)是长度不正确,或者哈希值本身(例如十六进制)的编码是错误的。这也可能是由于I / O问题(当然没有从插座中读取足够的数据等)。