我怎样写/放在一起PHP安全登录? 该网站的开发人员指南说我不应该推出自己的,所以参照通过谷歌是无用提供样品。
您如何利弊做呢? 比方说,你正在构建中轨世界一流的应用程序,将相同的库/技术是可用的吗?
谢谢
我怎样写/放在一起PHP安全登录? 该网站的开发人员指南说我不应该推出自己的,所以参照通过谷歌是无用提供样品。
您如何利弊做呢? 比方说,你正在构建中轨世界一流的应用程序,将相同的库/技术是可用的吗?
谢谢
在Rails中,一个一般会使用一个预先存在的库。 认证是很容易做到错了,这个问题一直在解决了这么多次,这是很不值得再解决这个问题的努力。 如果你有兴趣写自己的实现,那么我将介绍如何认证的现代作品。
验证用户的幼稚的方法是存储密码的数据库,并将其与用户提交的密码。 这很简单,但令人难以置信的是不安全的。 任何人谁可以阅读你的数据库可以查看任何人的密码。 即使你把数据库访问控制,你(和你的用户)是脆弱的人谁他们周围的黑客。
正确的方式是使用密码散列函数时,选择它,然后在每次提交的时间来处理密码。 好的哈希函数几乎是不可逆的 - 你不能把一个散列并把它放回密码。 因此,当用户登录时,你把密码提交,散列它,并将其与数据库中的哈希值。 这样一来,你永远不存储密码本身。 不利的一面,如果用户忘记了密码,你必须重新设置它,而不是发送给他们。
即使是这样,但是,很容易受到某些攻击。 如果攻击者得到你的密码哈希值的保持,并且知道如何散列你的密码,那么他就可以让字典攻击:他只是需要每一个字在字典和哈希这个词,与原来的保持它。 这个数据结构被称为彩虹表。 然后,如果任何字典单词散列的匹配密码哈希,攻击者可以断定密码是字典词,散列到该密码。 总之,谁可以读取你的数据库攻击者仍然可以登录与弱口令帐户。
该解决方案是,一个密码被散列之前,它结合了被称为盐值,它是唯一的每个用户(通常级联或异或)。 它可以是随机产生的,或者它可以是一个帐户创建时间戳或一些这样的。 然后,攻击者不能使用彩虹表,因为每个密码基本上散列略有不同; 他将不得不创建一个单独的彩虹表为每一个不同的盐(实际上为每个帐户),这将是令人望而却步计算上昂贵的。
我会附和其他应答者的建议:这不是简单的东西,你不需要做,因为它已经做过的,如果你自己做你站在一个非常好的犯了一个错误,并在不经意间妥协的机会您的系统安全。 但是,如果出于某种原因,你真的,真的想自己写一个,我希望我已经提供了它是如何做的(不完整的!)轮廓。
Zend框架有一个“验证”模块这将是一个良好的开端。 或者,如果你的网站将举办一个安装WordPress或PHPBB的,也有利用这些技术的身份验证模块登录到网站的其他页面的方式。
有一点要看看当你尝试进行身份验证的是什么,是你真正的目标。
例如,在所以我用我的谷歌登录,和这样的作品,因为他们只需要知道我是谁,以及他们可以信任,谷歌有一个想法。 所以,如果该模型会为你工作,再看看使用OpenID,因为有对各种工具。
如果你必须做你自己,那么就会有不同的测试,以确保它是安全的,再次,这取决于你想如何偏执是。
我将在这里结束我的回应是汤姆做了出色的响应。
通过Soulmerge:
我想在您的其他问题接受的答案指出它相当不错。 散列与盐的密码。 除此之外,还有传输层上的一些安全建议:
md5($_POST['postedPwHash'] . $salt)
) 在一定程度上保护客户端 - 服务器事务(如果没有SSL可用)的好方法是使用一次性随机密钥创建从证书的唯一的哈希,然后只发送唯一的哈希到服务器。 服务器那么这个散列进行比较,确认自己生成的散列而是比较真实的凭据。 这将提供对中间人攻击一个很好的防守。 不足之处是要做到这一点,用户必须启用JS(至少我不知道一个很好的方法,没有它来加密客户端数据)。 这意味着你将需要足够的回退时,它不是。 你甚至可以创建JS的形式,以确保它的启用。
这个库是一个简单的库我写一次,做我描述的过程,虽然它可能需要一些改进。
注意,这是除了使用“加盐”的方法和其他服务器端的安全性措施。 它也很容易受到字典攻击作为整个散列过程是通过定义程序,可预见的和可见的用户(如JS总是)。
我的回答是“不要做”
这是一个非常复杂的领域,充满了潜在的安全疑难杂症的的。 如果你不是这方面的专家,那么你真的只是自寻烦恼和问题的道路。
我会建议在寻找让现有的解决方案做。 可悲的是,我不知道有什么,我会比的OpenID乐意为您推荐其他。 我相信你会得到一些好的建议在这里,但...