2016-11-30 75 views
0

我在我的項目中有一個CryptoSwift.framework將字符串轉換爲md5。結果哈希字符串用於在服務器端進行授權。因此,我發送到此服務器的所有請求都使用此功能,並且一切正常,直到...可以md5返回無效結果嗎?

我收到
didRegisterForRemoteNotificationsWithDeviceToken方法中的deviceToken對象。然後,我將它轉換爲帶有「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

一個字符串不能直接傳遞給MD5。它需要先編碼。你確定CryptoSwift使用你應該用來進行授權的編碼嗎? – Codo

+0

爲什麼你認爲MD5是問題所在?授權中涉及很多步驟(例如構建散列字符串)可能會出錯。顯示所有相關的代碼。 – Codo

回答

2

算法 MD5不能產生不正確的結果。 MD5精確地返回16個字節的僞隨機值,這意味着輸出不能(很容易)與隨機區分開來。

現在通常會遇到的一個問題是,MD5的輸出(或任何其他加密函數)被直接用作字符串。然而,完全隨機的值可能與假定的編碼不匹配(例如Windows-1252/Latin或UTF-8)。這意味着在編碼/解碼過程中數據可能會丟失,這可能導致一個不同於16個字符/字節的字符串。

所以唯一可能出錯的是(除了空),長度不正確,或者散列值本身的編碼(例如十六進制)是錯誤的。這也可能是由於I/O問題(當然沒有從套接字中讀取足夠的數據等)。