【问题标题】:Authenticating FOS user outside of Symfony在 Symfony 之外验证 FOS 用户
【发布时间】:2017-02-28 07:42:09
【问题描述】:

我正在开发一个需要与现有 Symfony 安装配合使用的 API。 API 是使用 Perfect 用 Swift 编写的。

我已经确定 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 用户对我做错了什么或如何调试它的任何帮助。

【问题讨论】:

    标签: php swift symfony fosuserbundle perfect


    【解决方案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()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多