我正试图摆脱使用md5()来存储和比较密码。所以我想开始使用password_hash()。
现在,我以前是这样做的,我会在他们的会话或cookie中存储用户名和密码的md5(如果他们选择"记住我"),然后检查数据库查看是否有任何用户存在该用户名和密码为md5&d;密码。我意识到这不是很安全,这就是为什么我要阻止它。
我不能再这样做了,因为password_hash()总是会改变,所以我不能在他们的会话中存储哈希,然后在数据库中检查它,因为我需要在未使用密码的密码上使用password_verify。
所以我的问题是,如果我存储一个哈希"会话ID"和#34;令牌"在用户表中,当用户成功登录,然后将其与用户ID一起存储在人员会话/ cookie中以便检查数据库时,这是否足够安全?当我说哈希"会话ID"和#34;令牌"我的意思是sha256&甚至md5'随机大数字的哈希......
示例:
用户登录 - >哈希"会话ID"和#34;令牌"存储在用户cookie /会话中,并使用散列"会话ID"更新数据库中的行。和#34;令牌"。
用户访问网站 - >代码检查他们的"会话ID"和#34;令牌"基于浏览器会话/ cookie变量存在于数据库中。如果是,则假定找到的行代表当前用户。
非常感谢任何见解。
答案 0 :(得分:1)
我要做的是当用户登录时,使用uinqid()(http://php.net/uniqid)为其登录生成唯一ID,然后将其存储在新表中。 Id然后检查此表以查看cookie是否与表中存储的uniqid匹配。
当用户再次登录时,您必须确保删除表格行,但如果用户在多个设备上设置记住我,则会导致问题,因此我设置了过期表中的每个id的日期,登录脚本将:
用户登录时:
这是非常安全的,因为很难伪造这个cookie,并且它也没有将用户密码信息传递给客户端机器。
为了更加安全,你可以md5你生成的uniqid,但没有真正需要,因为它不包含重要信息。
这是相当复杂的,但如果你一步一步,那就不可能了。
祝你好运!答案 1 :(得分:0)
为了获得最佳密码哈希值和使用效果,并且编码简单,请参见以下示例...
$salts= ['cost' => 12];
password_hash("Password", PASSWORD_BCRYPT, $options);
$salts
是一个数组,它在使用password_hash()
时结合了多次。
PASSWORD_BCRYPT
是一个算法,用“$ 2y $”标识符和blowfish加密算法散列字符串。这会输出60个混乱的字符串。