我正在开发一个需要与现有 Symfony 安装一起使用的 API。API 是使用 Perfect 用 Swift 编写的。
我已经确定 Symfony 使用 FOS 用户包和 MessageDigest 编码器(又名 SHA 512 散列)。
查看源代码,我可以看到 FOS 生成随机字节盐。我可以看到这个盐值(32 个字符长的十六进制字符串)存储在数据库的用户表中。
然后,我继续实施了我在以下链接中看到的编码过程,在 Swift 中(注意,我包括从 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 用户对我做错了什么或如何进行调试的任何帮助。