Я разрабатываю 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 в том, что я делаю не так или как я мог бы отладить это.
Итак, я нашел решение, импортировав библиотеку 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()
}
Других решений пока нет …