我正在构建一个登录系统,我希望它是安全的,这样我就可以在几个项目中重复使用它。我使用下面的功能用我的密钥(32个字符)加密给定的密码。
function Encrypt($key, $payload)
{
$iv = mcrypt_create_iv(IV_SIZE, MCRYPT_DEV_URANDOM);
$crypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $payload, MCRYPT_MODE_CBC, $iv);
$combo = $iv . $crypt;
$garble = base64_encode($iv . $crypt);
return $garble;
}
我的IV_SIZE如下:
mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC))
在您提出要求之前,我不允许用户输入密码。我为它们生成了一个非常复杂和长密码的内容(大写,小写,数字和符号)。我还实施了一个禁止系统,允许您在非常有限的时间内插入错误的密码,并且好像它不够,我还锁定整个帐户,以便您可以“#”;即使禁令已经过期,也要再试一次。
这是解密功能仍然很标准:
function Decrypt($key, $garble)
{
$combo = base64_decode($garble);
$iv = substr($combo, 0, IV_SIZE);
$crypt = substr($combo, IV_SIZE, strlen($combo));
$payload = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $crypt, MCRYPT_MODE_CBC, $iv);
return $payload;
}
说我花了2个小时试图弄清楚发布登录会话/ cookie的最佳方法是什么。我想采用基于令牌的方法,如下所示。
登录成功后,我想在cookie中存储哈希的第一部分。整个哈希存储在我的数据库中,它是唯一的。它的第二部分就像是用户ID的salt + sha / md5 / base64(...),电子邮件,时间戳等。这是一个好方法吗?
答案 0 :(得分:0)
没有
除非您需要访问纯文本密码(例如,如果它是您使用的已配置SMTP服务器的密码),您不得加密密码,但 hash < / em>他们 并使用password_hash()(bcrypt)来哈希它们;它是专门为此目的而设计的。
此外,在你的问题中没有明确说明这些哈希值是什么,但它听起来似乎是一个有缺陷的选择 - MD5和SHA1不应该被用于任何类型的今天的安全机制,如果你想验证某些东西的真实性,你应该使用像 hash_hmac()
这样的键控散列函数。
使用通用PHP会话来维护登录状态。
在我看来,你过度思考手头的问题,反过来又过度设计了解决方案。保持简单。