使用PHP中的适当身份验证进行安全登

Rob*_*cks 5 php security authentication login ruby-on-rails

如何在PHP中编写/组合安全登录?该网站的开发人员指南说我不应该推出自己的,所以参照通过谷歌是无用提供样品.

你是如何做到这一点的呢?假设您正在使用rails构建世界级应用程序,是否可以在此处使用相同的库/技术?

谢谢

Tho*_*ith 20

在Rails中,通常会使用预先存在的库.身份验证很容易出错,问题已经解决了很多次,很难再次解决它.如果您有兴趣编写自己的实现,那么我将描述现代身份验证的工作原理.

验证用户的简单方法是将其密码存储在数据库中,并将其与用户提交的密码进行比较.这很简单但令人难以置信的不安全.任何能够读取您数据库的人都可以查看任何人的密码.即使你放入了数据库访问控制,你(和你的用户)也容易受到攻击他们的人的攻击.

正确的形式是使用加密哈希函数在选择密码时处理密码,然后在每次提交时使用密码.一个好的哈希函数实际上是不可逆的 - 你不能把哈希值转回密码.因此,当用户登录时,您将获取提交的密码,对其进行哈希处理,并将其与数据库中的哈希值进行比较.这样,您永远不会存储密码本身.在缺点方面,如果用户忘记了密码,则必须重置密码而不是将密码发送给他们.

然而,即便如此,也容易受到某些攻击.如果攻击者获取了您的密码哈希,并且知道如何散列您的密码,那么他就可以进行字典攻击:他只需将字典中的每个单词取出并对该单词进行哈希处理,并将其与原始单词保持一致.该数据结构称为彩虹表.然后,如果任何字典单词哈希值与密码哈希匹配,则攻击者可以断定密码是散列到该密码的字典单词.简而言之,可以读取数据库的攻击者仍然可以使用弱密码登录帐户.

解决方案是在对密码进行哈希处理之前,将其与一个名为salt的值组合(通常连接或xor'd),该值对每个用户都是唯一的.它可以是随机生成的,也可以是帐户创建时间戳或其他一些.然后,攻击者无法使用彩虹表,因为每个密码基本上都有不同的哈希值; 他必须为每一种不同的盐(实际上每个帐户)创建一个单独的彩虹表,这在计算上非常昂贵.

我会回应其他回答者的建议:这不是简单的事情,你不需要这样做,因为它已经完成了,如果你自己这样做,你很有可能犯错并无意中妥协你系统的安全性.但是,无论出于何种原因,如果你真的想要自己写一个,我希望我提供了一个(不完整的)大纲,说明它是如何完成的.