2017-02-28 57 views
0

我正在開發一個需要與現有Symfony安裝配合使用的API。該API使用Perfect編寫在Swift中。驗證Symfony以外的FOS用戶

我已判定的Symfony使用FOS用戶束和消息摘要編碼器(又名SHA 512散列)。

綜觀源,我可以看到,FOS生成隨機字節鹽。 我可以看到存儲在數據庫的用戶表中的鹽值(32個字符長的十六進制字符串)。

然後我繼續實施的編碼過程,我下面的鏈接看到,斯威夫特(注,我硬編碼包括從DB和與其匹配的密碼取鹽值)。

MessageDigestPasswordEncoder.php

@IBAction func calculate(_ id: AnyObject?) { 
     let raw = "1234" 
     let salt = "6bf3brej22cc8g0go04ck44g0co484c" 

     let salted = "\(raw){\(salt)}" 

     var digestData = salted.data(using: String.Encoding.utf8)?.sha512() 
     var digest = digestData!.toHexString() 

     for _ in 0..<5000 { 
      digestData = "\(digest)\(salted)".data(using: String.Encoding.utf8)?.sha512() 
      digest = digestData!.toHexString() 
     } 


     let encodedPass = digestData!.base64EncodedString() 

     NSLog("encodedPass: \(encodedPass)") 
    } 

不幸的是,結果我得到的是不一樣的字符串存儲在數據庫中的編碼字符串。

除非FOS不使用存儲在數據庫中的完全相同的鹽字符串我無法找到我的代碼中的任何錯誤。

我會很感激的FOS/Symfony的用戶是什麼,我做錯了任何幫助,不然我怎麼可能去調試這一點。

回答

0

所以,我發現通過導入CommonCrypto lib中的解決方案。 (通過自定義module.modulemap),而不是使用SHA512哈希(我正在使用)的第三方框架:

func calculateCommonCrypto() { 
    let raw = "1234" 
    let salt = "6bf3brej22cc8g0go04ck44g0co484c" 

    let salted = "\(raw){\(salt)}" 

    let saltedData = NSData(data: salted.data(using: String.Encoding.utf8)!) 
    var digest = [UInt8].init(repeating: 0, count: Int(CC_SHA512_DIGEST_LENGTH)) 

    CC_SHA512(saltedData.bytes, CC_LONG(saltedData.length), &digest) 

    var combinedData = NSMutableData() 
    let saltedBytes = NSData(data: salted.data(using: String.Encoding.utf8)!) 

    for _ in 1 ..< 5000 { 
     combinedData.append(&digest, length: digest.count) 
     combinedData.append(saltedBytes.bytes, length: saltedBytes.length) 

     CC_SHA512(combinedData.bytes, CC_LONG(combinedData.length), &digest) 

     combinedData = NSMutableData() 
    } 

    let finalData = Data(bytes: digest) 

    let encodedStr = finalData.base64EncodedString() 
}