簡體   English   中英

如何只加載一次函數並將返回值存儲在變量中?

[英]How can I load a function just once and store the return in a variable?

我目前正在查看用戶注冊碼。 我現在關注的部分是密碼哈希部分。

我要做的是從配置文件中獲取static_salt,並使用mt_rand()生成dynamic_salt。 我想要做的是將這個dynamic_salt存儲在我的數據庫中。

但是,如果我將dynamic_salt()方法傳遞給create方法,以便將其發送到數據庫中某個表的salt列,它將再次運行該方法,並創建與hashed()方法產生的結果不同的結果。

實現我想要達到的目標的最佳方法是什么,如果可以,請給我一個例子嗎?

public function create() {

                $dbcolumn->password = $this->hashed();
                $dbcolumn->salt = $this->dynamic_salt;
                $this->db->insert('users', $dbcolumn);

    }

public function dynamic_salt() {

            $get_dynamic_salt = mt_rand();
            return $get_dynamic_salt;
}

public function hashed() { //hashing method, that also makes
            // sha1 and salt password
            $static_salt = $this->config->item('encryption_key'); //grab static salt from config file
            $dynamic_salt = $this->dynamic_salt();

        $password = $this->encrypt->sha1($this->input->post('password')); //encrypt user password
            $hashed = sha1($dynamic_salt . $password . $static_salt);

            return $hashed;
}

我建議您不要使用動態鹽,因為它會降低應用程序的靈活性,並且可能無法以當前形式運行。

的目的是防止有人獲得您的用戶數據庫時可以進行的字典攻擊 在這方面,靜態鹽絕對是在您的應用程序中實現的一個好主意。

向每個用戶添加動態鹽將意味着您將必須命中數據存儲以檢索動態鹽和用戶密碼的哈希版本,然后,您將必須執行CPU密集型哈希功能(在您的代碼中,兩次-您正在對安全性較低且更可能發生沖突的哈希進行哈希處理)。

具有簡單的已知靜態鹽和哈希密碼,將使您可以在應用程序增長時使用鍵/值存儲系統(例如memcache) 將用戶標識存儲為密鑰,將用戶哈希密碼存儲為值,您將擁有一個快速的身份驗證系統。

嘗試這個:

public function dynamic_salt() {
    if(!isset($this->dyn_salt))
       $this->dyn_salt = mt_rand();
    return $this->dyn_salt;
}

如果dyn_salt實例變量尚不存在,它將為它分配mt_rand()的結果,否則它將僅返回先前的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM