Php 此用户身份验证是否足够安全?
我正在尝试放弃使用md5()来存储和比较密码。所以我想开始使用密码\u hash() 现在,我以前是这样做的,我会在他们的会话或cookie(如果他们选择“记住我”)中存储用户名和他们密码的md5,然后检查数据库,看看是否存在使用该用户名和md5密码的用户。我意识到这不是很安全,这就是为什么我想阻止这一切 我不能再这样做了,因为password\u hash()总是会更改,所以我不能在他们的会话中存储一个hash,然后在数据库中检查它,因为我需要对未更改的密码使用password\u verify 因此,我的问题是,如果我在用户成功登录时在用户表中存储散列的“会话id”和“令牌”,然后将其与用户id一起存储在persons session/Cookie中以检查数据库,这是否足够安全?当我说散列的“会话id”和“令牌”时,我指的是随机大数的sha256'd甚至md5'd散列 例如: 用户登录->散列的“会话id”和“令牌”存储在用户cookie/会话中,并使用散列的“会话id”和“令牌”更新其在数据库中的行 用户访问站点->代码根据浏览器会话/cookie变量检查其“会话id”和“令牌”是否存在于数据库中。如果是,则假定找到的行代表当前用户Php 此用户身份验证是否足够安全?,php,security,authentication,hash,Php,Security,Authentication,Hash,我正在尝试放弃使用md5()来存储和比较密码。所以我想开始使用密码\u hash() 现在,我以前是这样做的,我会在他们的会话或cookie(如果他们选择“记住我”)中存储用户名和他们密码的md5,然后检查数据库,看看是否存在使用该用户名和md5密码的用户。我意识到这不是很安全,这就是为什么我想阻止这一切 我不能再这样做了,因为password\u hash()总是会更改,所以我不能在他们的会话中存储一个hash,然后在数据库中检查它,因为我需要对未更改的密码使用password\u verif
如果您有任何见解,我们将不胜感激。下面的示例提供了最佳密码哈希和用法,同时代码也很简单
$salts=['cost'=>12];
密码\u散列(“密码”,密码\u BCRYPT,$options)代码>
$salts
是一个数组,当使用密码\u hash()
时,它组合了多个时间
PASSWORD\u BCRYPT
是一种使用“$2y$”标识符和blowfish加密算法对字符串进行散列的算法。这将输出60个字符的混乱集。我要做的是,当用户登录时,使用uinqid()为他的登录生成一个唯一的id,然后将其存储在一个新表中。然后检查此表,查看cookie是否与表中存储的uniqid匹配
您必须确保在用户再次登录时删除表行,但如果用户在多个设备上设置了“记住我”,则会导致问题,因此我会在表中为每个id设置过期日期,登录脚本将:
从$current\u date\u和\u time>的“UNIQIDS”中选择*并删除所有结果
检查是否存在cookie。如果有一个会话并且它与uniqid匹配,则在计算机上创建一个会话,否则显示登录页面
用户登录时:
检查表中是否已存储uniqid
如果存储了一行,如果当前日期和时间超过其过期日期,则删除该行
如果该cookie已过期,则生成一个新cookie,其新过期日期与您正在生成的cookie的过期日期匹配。如果该cookie尚未过期,请计算从现在到过期的时间,并创建一个包含其值的cookie,该cookie将在您计算的时间内过期
这是高度安全的,因为很难伪造此cookie,而且它不会将用户密码信息传递到客户端计算机
为了更安全,您可以md5生成的uniqid,但没有真正的需要,因为它不包含重要信息
这是相当复杂的,但如果你一步一步地去做,那就不可能了
祝你好运 您可以使用盐渍密码哈希。@PraveenD-Password_hash()已经生成盐渍哈希了。。。。您的实际建议是什么?Salt应该是随机的。@PraveenD-password_hash()生成一个Salt散列,其中Salt已经是随机的了。。。。。OP已经意识到了这一点,如果您解释了您的意思,静态salt可能会完全消除使用password_hash的效果。如果要这样做,我最好还是坚持使用md5()。您可以添加任意数量的键⇒$salts中的值
请不要做['salt'=>12]
,你想要['cost'=>12]
。这是对的@Scott Arciszewski,我后来意识到。使用['cost'=>12]
这并不能解决OPs问题。虽然密码散列也是如此,但问题是如何存储会话令牌,其散列必须可搜索且不能包含随机salt。在存储到数据库中之前,应对令牌进行散列,否则具有db读取权限(SQL注入)的攻击者可以读取令牌并模拟用户。因为令牌(20+随机字符)是一个非常强的“密码”,所以可以使用像SHA-256这样的快速非盐散列,使它们具有可比性。不一定。如果从表中选择所有行,不给最终用户访问SQL语句的权限,创建一个assoc,并使用for/loop让php搜索assoc,而不是让mysql在返回assoc之前搜索表,则会使表不受SQL注入的影响。在那之后,如果你的SQL被黑客攻击,你会遇到比哈希的安全性更大的问题。它不一定是一个带有标记的表查询,这可能会暴露哈希,每个SQL语句都必须安全。请看我书中的例子。如果您使用第三方库,您也必须测试此代码。即使这样,代币也会有其他方式丢失,丢弃的服务器,备份,……对不起,先生,你是对的。uniqid应该进行散列以确保安全性以及任何其他潜在的敏感信息,但谨慎的做法是确保采取预防措施防止sql注入,因为任何确定的黑客都可以在足够的时间内破解散列。还要确保uniqid和cookie的过期频率相当高,以防止有人通过重复创建具有不同值的假cookie来粗暴地破坏您的系统。