////////////////////////////////////////////////////////////////////////////// ////////////
这个问题收到了很多点击,比我想象的在这样一个基本话题上的点击量要多。所以,我想我会告诉人们我在做什么。此外,我还在评论中看到我将密码存储为纯文本。只是为了澄清我不是。
我更新的验证功能:
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;
}
}
我对此的想法是,如果我们让“用户”/攻击者知道我的密码由什么组成,攻击者会不会更容易知道?我知道通过默默无闻的安全性不是最佳实践,但在这种情况下它可以成为一个强有力的论据吗?
我想知道我是否以正确的方式处理这件事。任何帮助都会很棒。