Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Swift在Firebase中设置哈希密码?_Swift_Firebase_Passwords_Firebase Authentication - Fatal编程技术网

如何使用Swift在Firebase中设置哈希密码?

如何使用Swift在Firebase中设置哈希密码?,swift,firebase,passwords,firebase-authentication,Swift,Firebase,Passwords,Firebase Authentication,我在跟踪一个优步克隆人。我可以让登录、注册和注销工作,但密码似乎没有散列;我可以在Firebase数据库中清楚地看到它们 这是我的密码。首次登录/注册/注销功能保存在与控制器分开的“插件”文件夹中 import Foundation import FirebaseAuth typealias LoginHandler = (_ msg: String?) -> Void; struct LoginErrorCode { static let INVALID_EMAIL = "

我在跟踪一个优步克隆人。我可以让登录、注册和注销工作,但密码似乎没有散列;我可以在Firebase数据库中清楚地看到它们

这是我的密码。首次登录/注册/注销功能保存在与控制器分开的“插件”文件夹中

import Foundation
import FirebaseAuth

typealias  LoginHandler = (_ msg: String?) -> Void;

struct LoginErrorCode {
    static let INVALID_EMAIL = "Invalid email, please provide a real email address";
    static let WRONG_PASSWORD = "Wrong Password, Please Try Again";
    static let PROBLEM_CONNECTING = "Problem Connecting to Database. Please Try Later";
    static let USER_NOT_FOUND = "User Not Found, Please Register";
    static let EMAIL_ALREADY_IN_USE = "Email Already In Use, Please Use Different Email";
    static let WEAK_PASSWORD = "Password Should Be At Least 6 Characters";
}

class AuthProvider {
    private static let _instance = AuthProvider();

    static var Instance: AuthProvider {
        return _instance;
    }

    func login(withEmail: String, password: String, loginHandler: LoginHandler?) {
        FIRAuth.auth()?.signIn(withEmail: withEmail, password: password, completion: { (user, error) in
            if error != nil {
                self.handleErrors(err: error as! NSError, loginHandler: loginHandler);
            } else {
                loginHandler?(nil);
            }
        })
    } //login func

    func signUp(withEmail: String, password: String, loginHandler: LoginHandler?) {
        FIRAuth.auth()?.createUser(withEmail: withEmail, password: password, completion: { (user, error) in
            if error != nil {
                self.handleErrors(err: error as! NSError, loginHandler: loginHandler);
            } else {
                if user?.uid != nil {
                    // store the user to database
                    DBProvider.Instance.saveUser(withID: user!.uid, email: withEmail, password: password)
                    //log in the user
                    self.login(withEmail: withEmail, password: password, loginHandler: loginHandler)
                }
            }
        })

    } //sign up func

    func logOut() -> Bool {
        if FIRAuth.auth()?.currentUser != nil {
            do {
                try FIRAuth.auth()?.signOut();
                return true;
            } catch {
                return false;
            }
        }
        return true
    }

    private func handleErrors(err: NSError, loginHandler: LoginHandler?) {
        if let errCode = FIRAuthErrorCode(rawValue: err.code) {
            switch errCode {
            case .errorCodeWrongPassword:
                loginHandler?(LoginErrorCode.WRONG_PASSWORD);
                break;
            case .errorCodeInvalidEmail:
                loginHandler?(LoginErrorCode.INVALID_EMAIL);
                break;
            case .errorCodeUserNotFound:
                loginHandler?(LoginErrorCode.USER_NOT_FOUND);
                break;
            case .errorCodeEmailAlreadyInUse:
                loginHandler?(LoginErrorCode.EMAIL_ALREADY_IN_USE);
                break;
            case .errorCodeWeakPassword:
                loginHandler?(LoginErrorCode.WEAK_PASSWORD);
                break;
            default:
                loginHandler?(LoginErrorCode.PROBLEM_CONNECTING);
                break;
            }
        }
    }
} //class
以及控制器:

import UIKit
import FirebaseAuth

class SignInVC: UIViewController {
    private let DRIVER_SEGUE = "DriverVC";

    @IBOutlet weak var emailTextField: UITextField!

    @IBOutlet weak var passwordTextField: UITextField!


    override func viewDidLoad() {
        super.viewDidLoad()


        // Do any additional setup after loading the view.
    }

    @IBAction func login(_ sender: Any) {

        if emailTextField.text != "" && passwordTextField.text != "" {
            AuthProvider.Instance.login(withEmail: emailTextField.text!, password: passwordTextField.text!, loginHandler: { (message) in
                if message != nil {
                    self.alertTheUser(title: "Problem With Authentication", message: message!);
                } else {
                    self.performSegue(withIdentifier: self.DRIVER_SEGUE, sender: nil)
                }
            });
        } else {
            alertTheUser(title: "Email And Password Are Required", message: "Please enter email and password");
            }
           }


    @IBAction func signUp(_ sender: Any) {
        if emailTextField.text != "" && passwordTextField.text != "" {
            AuthProvider.Instance.signUp(withEmail: emailTextField.text!, password: passwordTextField.text!, loginHandler: { (message) in
                if message != nil {
                    self.alertTheUser(title: "Problem With Creating New Account", message: message!)
                } else {
                    self.performSegue(withIdentifier: self.DRIVER_SEGUE, sender: nil)
                }
            })
        } else {
            alertTheUser(title: "Email And Password Are Required", message: "Please enter email and password");
        }
    }


    private func alertTheUser(title: String, message: String) {
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert);
        let ok = UIAlertAction(title: "OK", style: .default, handler: nil);
        alert.addAction(ok);
        present(alert, animated: true, completion: nil)
    }


} //class

尝试使用
updatePassword(\uPassword:String,completion:FirebaseAuth.FIRUserProfileChangeCallback?=nil)
FIRUser

上是否需要添加这些内容?它不是FirebaseAuth的一部分?仅仅使用哈希函数是不够的,仅仅添加一个salt对提高安全性几乎没有作用。取而代之的是,在HMAC上随机添加盐,持续约100毫秒,并将盐与散列一起保存。使用诸如
PBKDF2
Rfc2898DeriveBytes
password\u hash
Bcrypt
等函数和类似函数。关键是让攻击者花费大量时间通过暴力手段查找密码。