Аутентификация пользователя FOS вне Symfony

Я разрабатываю API, который должен работать с существующей установкой Symfony. API написан на Swift с использованием Perfect.

Я определил, что Symfony использует пользовательский пакет FOS и кодировщик MessageDigest (также известный как хеширование SHA 512).

Глядя на исходники, я вижу, что FOS генерирует случайную соль байтов. Я вижу это значение соли (длинная шестнадцатеричная строка из 32 символов), хранящееся в пользовательской таблице в БД.

Затем я пошел дальше и реализовал процесс кодирования, который я вижу по следующей ссылке, в Swift (обратите внимание, я включаю жестко закодированное значение соли, взятое из базы данных, и соответствующий пароль).

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 в том, что я делаю неправильно, или как я мог бы отладить это.


person Konstantinos Kontos    schedule 28.02.2017    source источник


Ответы (1)


Итак, я нашел решение, импортировав библиотеку CommonCrypto. (через пользовательский 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()
}
person Konstantinos Kontos    schedule 28.02.2017