////////////////////////////////////////////////////////////////////////////// ////////////
这个问题收到了很多点击,比我想象的在这样一个基本话题上的点击量要多。所以,我想我会告诉人们我在做什么。此外,我还在评论中看到我将密码存储为纯文本。只是为了澄清我不是。
我更新的验证功能:
public function is_password($str) {
        if (strlen($str) < 10) { // Less then 10
            $this -> set_message('is_password', 'Password must include at least one number, one letter, one capital letter , one symbol and be between 10 and 100 characters long.');
            return FALSE;
        } elseif (strlen($str) > 100) { // Greater then 100
            $this -> set_message('is_password', 'Password must include at least one number, one letter, one capital letter , one symbol and be between 10 and 100 characters long.');
            return FALSE;
        } elseif (!preg_match("#[0-9]+#", $str)) { // At least 1 number
            $this -> set_message('is_password', 'Password must include at least one number, one letter, one capital letter , one symbol and be between 10 and 100 characters long.');
            return FALSE;
        } elseif (!preg_match("#[a-z]+#", $str)) { // At least 1 letter
            $this -> set_message('is_password', 'Password must include at least one number, one letter, one capital letter , one symbol and be between 10 and 100 characters long.');
            return FALSE;
        } elseif (!preg_match("#[A-Z]+#", $str)) { // At least 1 capital
            $this -> set_message('is_password', 'Password must include at least one number, one letter, one capital letter , one symbol and be between 10 and 100 characters long.');
            return FALSE;
        } elseif (!preg_match("#\W+#", $str)) { // At least 1 symbol
            $this -> set_message('is_password', 'Password must include at least one number, one letter, one capital letter , one symbol and be between 10 and 100 characters long.');
            return FALSE;
        } else {
            return TRUE; // No errors
        }     
    }
每次返回时FALSE,我总是告诉他们需要的整个密码。
只是为了回答一些关于为什么它这么长的问题:
为什么不这么久?我工作的人会使用句子。很长的那个。
我如何散列我的密码?/ 为什么要使用 100 个字符?-> 只使用更好的散列算法
对于 PHP,我正在使用最好的语言。我正在使用这个库,它是Anthony Ferrara创建的新密码哈希 API的 PHP 5.5 等价物。我使用这种散列的理由很简单,对 CPU 的要求非常高(如果你曾经在 Linux/Windows 机器上测试过,CPU 使用率是 100%)。此外,由于成本因素,该算法具有很强的可扩展性尝试登录,我什至在通过登录屏幕之前就收到了 PHP 超时错误(这是一个愚蠢的成本因素)。杰里米·戈斯尼 ( Jeremi Gosney ) 所做的一项研究 (这是报告的 PDF 下载)与其他更流行的函数(是的,更流行的)相比,它测试了这个函数的强度,得出的结论是,即使使用 25 个 GPU,而使用 bcrypt 的成本为 5,密码散列是你的最后一个顾虑。我用17的成本...
如果有人感兴趣,我的功能(至少与该主题有关的部分):
public function create_user($value) {
        $this -> CI = get_instance();
        $this -> CI -> load -> library('bcrypt');
        foreach ($value as $k => $v) {// add PDO place holder to the keys
            $vals[":$k"] = $v;
        }
        $vals[":password"] = $this -> CI -> bcrypt -> password_hash($vals[":password"], PASSWORD_BCRYPT, array("cost" => 17)); // Take old $vals[":password"] and run it through bcrypt to come up with the new $vals[":password"] 
希望这个问题可以帮助其他人。
//////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////
我目前正在做一个新项目,遇到了一个问题。
披露您的密码要求是否安全?如果是这样,为什么它是安全的?
我有一个对密码进行验证的函数,每个步骤都向用户展示了验证不起作用的原因。
这是我的功能:
public function is_password($str) {
    if (strlen($str) < 10) {
        $this -> set_message('is_password', 'Password too short.');
        return FALSE;
    } elseif (strlen($str) > 100) {
        $this -> set_message('is_password', 'Password is too long.');
        return FALSE;
    } elseif (!preg_match("#[0-9]+#", $str)) {
        $this -> set_message('is_password', 'Password must include at least one number.');
        return FALSE;
    } elseif (!preg_match("#[a-z]+#", $str)) {
        $this -> set_message('is_password', 'Password must contain at least one letter.');
        return FALSE;
    } elseif (!preg_match("#[A-Z]+#", $str)) {
        $this -> set_message('is_password', 'Password must contain at least one capital letter.');
        return FALSE;
    } elseif (!preg_match("#\W+#", $pwd)) {
        $this -> set_message('is_password', 'Password must include at least one symbol.');
        return FALSE;
    } else {
        return TRUE;
    }
}
我对此的想法是,如果我们让“用户”/攻击者知道我的密码由什么组成,攻击者会不会更容易知道?我知道通过默默无闻的安全性不是最佳实践,但在这种情况下它可以成为一个强有力的论据吗?
我想知道我是否以正确的方式处理这件事。任何帮助都会很棒。