http - 基于表单的网站身份验证

  显示原文与译文双语对照的内容

网站的Form-based身份验证

我们认为堆栈溢出不仅仅是针对特定技术问题的资源,也是关于如何解决常见问题的变化的一般性指南。 "基于表单 网站的认证"应该是这样一个实验的一个很好的主题。

它应该包括以下主题:

  • 如何登录
  • 如何保持登录
  • 如何存储密码
  • 使用机密问题
  • 忘记的用户名/密码功能
  • OpenID
  • "记住我"复选框
  • 用户名和密码的浏览器自动补全
  • 机密 url ( 由摘要保护的公共 url )
  • 正在检查密码强度
  • E-mail 验证
  • 更多关于 基于表单 身份验证 。。

它不应该包含以下内容:

  • 角色和授权
  • HTTP基本身份验证

请帮助我们

  1. 建议副标题
  2. 提交关于这里主题的文章
  3. 编辑官方答复
时间:

第 I: 部分如何登录

  1. 作为一个规则,验证程序应该是最后一个。 他们往往是令人讨厌的,往往不是human-solvable,对机器人大部分都是无效的,他们所有的人都对third-world廉价劳动力( 根据 OWASP,当前的sweatshop工厂速率是 $12每 500个测试) 无效,在一些国家和一些实现技术上非法( 请参阅 OWASP指南验证 ) 。 如果你必须使用验证码,请使用 reCAPTCHA,因为它是OCR-hard的。

  2. 可以防止某些浏览器使用自动完成标记存储/检索表单/输入字段的密码。 然而,在现实世界中,你的客户在不同的系统上会有很多账户;如果他们对每个站点使用相同的密码,它就会危及安全。 你能指望他们为每个网站记住不同的密码? 有一些不错的密码管理器,但是也有坏的,这将成为攻击者的目标。 最新版本的Chrome web 还允许用户 over-ride autocomplete=off,否定任何阻止这里操作的努力。

  3. 在登录过程中,只需使用certificate-based加密方案( 例如 SSL ) 或者经过验证的&测试challenge-response方案( 例如 Diffie-Hellman -based SRP ) 来防止登录拦截( 数据包嗅探)的 ( 当前实际) 。 其他方法可以很容易地规避窃听攻击者。 ,注意:哈希密码 client-side ( 例如使用 JavaScript ) 往往是无用的( 并且可以是安全漏洞 ), 除非它是结合以上—也就是说,保护与强加密或使用 tried-and-tested ( 如果你不知道那是什么,你就会知道它是最难证明的,最困难的设计,以及在数字安全中实现概念最困难) challenge-response机制。 哈希密码有效反对披露密码,但不反对重播攻击,Man-In-The-Middle攻击/hijackings或者( 因为我们正在给攻击者提供用户名,salt和散列密码) brute-force攻击。

  4. 在发送身份验证令牌之后,系统需要一种方法来记住你已经被认证了- 这个事实应该只在会话数据中被存储在服务器端。 cookie可以用于引用会话数据。 只要可能,cookie应该在发送到浏览器时设置安全和HTTP唯一标志。 httponly标志提供了对由XSS攻击读取的cookie的一些保护。 安全标志确保cookie只通过HTTPS发送,因此防止网络嗅探攻击。 cookie的值不能是可以预测的。 如果存在引用不存在会话的cookie,则应立即替换它的值以防止会话固定。

第II部分:如何保持登录- 臭名昭著的"记住我"复选框

永久登录 Cookies ("记住我"功能) 是一个危险区域;一方面,当用户理解如何处理它们时,他们完全安全,用户知道如何处理,不知道 Cookies,或者如何删除它们。

就个人而言,我希望我经常为网站访问我的永久登录,但我知道如何安全地处理它们。 如果你确信你的用户知道相同的情况,那么你可以使用永久的登录和干净的良心。 如果不是,那么你更喜欢我,订阅用户粗心的哲学登录凭证带在自己如果他们被攻击的原因。 它不像我们去我们的房子的用户和撕掉那些 facepalm-inducing Post-It笔记密码他们排队边缘的显示器,。 如果人们是白痴,那么就让他们吃蛋糕吧。

当然,一些系统不能承受任何帐户入侵;对于这样的系统,没有办法你可以证明有持久的登录。

实现持久登录 Cookies, 如果你决定这是你如何做:

  1. 首先,遵循 Charles'米勒最佳实践'文章不要尝试遵循 '改进'最佳实践在他文章末尾链接。 不幸的是,该方案的'改进'很容易被( 所有攻击者都必须在窃取'改进改进的'cookie is记住删除旧的。 这将要求合法用户 re-login,创建一个新的序列标识符,并使被盗的一个有效。

  2. And do not STORE PERSISTENT LOGIN COOKIE ( 令牌) in your database, only A HASH of it! 登录令牌是等价的,所以如果攻击者在你的数据库中获得了控制权,他/她可以使用令牌登录到任何帐户,就像他们是明文login-password组合一样。 因此,在存储永久登录令牌时使用哈希( 根据 http://security.stackexchange.com 63438/5002,一个弱散列可以满足这个目的) 。

第III部分:使用机密问题

。从不使用'机密问题' 。 看报纸从链接数量 5 MUST-READ列表。 你可以在她的雅虎之后询问莎拉。Palin ! 电子邮件帐户在总统竞选期间被黑了,因为她的'安全性'问题的答案是。。 ( 等待它) 。。"wasilla高中" !

即使有user-specified问题,大多数用户也可能会选择:

  • 一个'标准'的秘密问题,比如母亲的名字或者心爱的宠物

  • 一个简单的琐事,任何人都可以从他们的博客,LinkedIn的配置文件,或者类似

  • 任何比猜测密码更容易回答的问题。 对于任何一个像样的密码,都是可以想象的。

总之,安全问题在它们的所有形式和变体中都是不安全的,并且不应该在身份验证方案中使用,原因是任何原因。

第二个问题通常被认为足以满足two-factor认证的需求。 而捕获的一些React通过点击而不是打字在理论上提供了防止键盘记录器的攻击,它仍然只是一个扩展密码机制,当用户提出了与一个文本框,而不是drop-downs钓鱼网站,他们很少认为这是不正常的。 注意,你可以完成你的two-factor义务通过使用一个持久的饼干( 在提交多个验证问题时授予) 代替安全问题要求每一个时间,但以牺牲用户方便。

任何人的唯一原因仍然使用安全问题,选择是节省成本的几个支持电话用户可以不记得他们的电子邮件密码来重新激活码。 以Palin的安全和Sara声誉为代价。 值你是法官。

第IV部分:忘记的密码功能

为什么你应该提到从未使用安全问题来处理被遗忘/丢失用户密码;此外不用说你应该从未 E-mail 用户其密码 。 在这里字段中至少还有两个all-too-common陷阱:

  1. 不要重设用户密码无论什么-'重设'密码更难让用户记住,这意味着他/她必须改变它,或者写在显示器边缘的明亮的黄色Post-It上。 相反,只允许用户立即选择一个新的- 这就是他们想要做的。

  2. 总是在数据库中散列丢失的密码/令牌。 再次,这段代码的另一个例子是一个密码等效,因此它必须散列,以防攻击者得到他的手在你的数据库。 当一个丢失的密码代码被请求时,将明文代码发送给用户地址的电子邮件,然后将哈希保存到数据库--和丢弃原来的 。 就像密码或者永久登录令牌。

final 注意:要确保进入'丢失密码代码'的接口至少与你的登录表单一样安全,或者攻击者会使用它来获得访问权。 确保生成非常长的'丢失密码代码'( 例如 16大小写敏感字符) 是一个不错的开始,但考虑添加相同的限制,你可以为登录添加相同的限制。

部件 V: 检查密码强度

首先,你需要阅读这篇小文章进行实际检查: 500最常用的密码

好吧,或许不是列表规范最常用的密码列表任何系统,但它是一个好迹象差的人会选择自己的密码如果没有执行政策。 +,看起来令人恐惧地接近回家当你比较的公开分析 40.000 + myspace最近被盗密码。

现在MySpace-bashing足够了。 继续前进。

因此:没有最低的密码强度要求,2%的用户使用最常用的20个密码。 意思:如果攻击者只获取 20次尝试,你的网站上的1个帐户将是 50.

Thwarting这需要计算密码的熵,然后应用一个阈值。 国家标准和技术( NIST ) 特殊出版物 800 -63 有一套非常好的建议。 ,如果再加上一个字典和键盘布局分析( 例如'qwertyuiop'密码有误), 可以拒绝 99%所有糟糕的选择密码 18水平位的熵。 简单计算密码强度并向用户显示视觉强度指示器不够。 除非被强制,否则用户将忽略它。

第VI部分:更多- 或者: 阻止Rapid-Fire登录尝试

首先,看看这些数字: 密码恢复速度- 你的密码支持多长时间

如果你没有时间查看该链接中的表格,下面是它们的列表:

  1. 需要几乎没有时间破解弱密码,即使你是用算盘破解它

  2. 需要几乎没有时间破解一个字母数字 9 -character密码,如果是不分大小写

  3. 需要几乎没有时间裂纹错综复杂, symbols-and-letters-and-numbers,upper-and-lowercase密码,如果是不到 8字符(台式电脑可以搜索整个 keyspace 7字符在几天甚至几小时)

  4. 然而,会花大量的时间裂缝甚至 6 -character密码,每秒如果仅限于一个尝试!

那么我们从这些数字中可以学到什么? 很好,但我们可以关注最重要的部分: 阻止大量rapid-fire连续登录尝试的事实( IE 。 brute attack攻击) 真的不是那么难。 但是防止它 就像看起来不那么容易。

一般来说,你有三个选择,都是有效brute-force攻击 ( 和字典攻击,但是既然你已经使用了一个强大的密码策略,它们就不应该是一个问题) :

  • 后呈现出 CAPTCHA n失败(恼人的地狱和经常无效--但是我重复我自己)

  • 锁定账户n和要求邮件验证失败后(这是 DoS攻击即将发生)

  • 最后,登录节流 : 也就是说,在尝试( 是的,DoS攻击仍然是可能的,但至少它们是不那么可能的,而且更复杂) 失败的尝试之间设置一个时间延迟失败。

最佳实践 #1: 短时间延迟的数量增加而失败的尝试,如:

  • 1 失败尝试= 无延迟
  • 2 失败尝试= 2秒延迟
  • 3 失败尝试= 4秒延迟
  • 4 失败尝试= 8秒延迟
  • 5 失败尝试= 16秒延迟
  • 等等.

dos攻击这个方案会很不切实际,但另一方面,潜在的破坏性,因为延误成指数增加。 持续几天的DoS攻击可能会使用户持续数周。

澄清:延迟不是推迟之前返回到浏览器的响应。 它更像是一个超时或者不可用的时间段,在这里期间,登录尝试或者从特定的IP地址登录将不会被接受或者评估。 也就是说,正确的凭据不会在成功的登录中返回,不正确的凭据不会触发延迟增加。

最佳实践 #2: 中等长度的时间延迟生效n失败的尝试之后,如:

  • 0 1-4失败的尝试= 无延迟
  • 5 失败尝试= 15 -30最小延迟

DoS攻击这个方案可能是不切实际的,但确实可行。 另外,可能需要注意的是,如此长的延迟对于合法用户来说非常烦人。 健忘的用户将不喜欢你。

最佳实践 #3: 组合两种方法- 要么是固定的,要么在N 次失败的尝试之后生效,比如:

  • 0 1-4失败的尝试= 无延迟
  • 5+失败尝试= 20秒延迟

或者,具有固定上限的延迟增加,比如:

  • 1 失败尝试= 5秒延迟
  • 2 失败尝试= 15秒延迟
  • 3+失败尝试= 45秒延迟

这个 final 方案取自 OWASP best-practices建议( 链接 1来自MUST-READ列表),应该被认为是最佳实践,即使它是在限制性方面。

然而,作为一个经验法则,我要说: 你的密码策略越强,Bug 用户就越少。 如果你需要强有力的( case-sensitive字母数字+ 需要数字和符号) 9+字符的密码,你能给用户 2 -4 non-delayed密码激活节流前尝试。

dos攻击这个 final 登录节流方案将非常不切实际。 作为一个 final touch,总是允许永久的( cookie ) 登录( 和/或者CAPTCHA-verified登录表单) 通过,这样当攻击正在进行时,合法的用户甚至不会被延迟 。 这样,非常不实际的DoS攻击就变成了一个的不切实际的攻击。

另外,对管理员账户做更积极的节流是有意义的,因为它们是最吸引人的入口点

第七部分:分布式暴力攻击

更重要的是,更高级的攻击者将试图绕过'展开他们的活动'的登录限制:

  • 在僵尸网络上分发尝试以阻止IP地址标记

  • 他们不是挑选一个用户,而是尝试 50.000个最常用的密码( 因为我们的限制,他们不能),他们会选择最常用的密码,并对 50.000个用户进行尝试。 这样,他们不仅可以绕过maximum-attempts度量和登录限制,他们的成功几率也增加了,因为数字 1最常见的密码比数字 49.995更有可能

  • 将每个用户帐户的登录请求( 比如 30秒) 隔开,以潜入雷达

这里的最佳实践是日志登录失败的数量,系统范围的,使用运行平均bad-login网站频率作为一个上限的基础,然后对所有用户。

太抽象了让我重新描述一下:?

假设你的站点在过去的12个月中平均每天有 120个错误的登录。 ( 跑步平均) 使用,你的系统可能设置全局限制 3倍 -- IE 。 360超过 24小时的尝试失败。 然后,如果失败的尝试在所有账户的总数超过这一数字在一天( 甚至更好,监视计算的treshold上加速和触发器的速度), 激活系统范围内所有用户的登录节流——这意味着短延迟( 但是,除了cookie登录和/或者备份验证器登录之外) 。

我也贴出了问题更多的细节和一个很好的讨论如何避免棘手pitfals在fending分布式蛮力攻击

第VIII部分:Two-Factor身份验证和身份验证提供程序

凭证可以泄露,不管是利用、密码写下来和丢失, 笔记本 钥匙被盗,或者用户进入登录到钓鱼网站。 登录可以通过two-factor身份验证来保护,该身份验证使用out-of-band因素,如从电话,短信或者dongle接收的single-use代码。 几个提供程序提供two-factor身份验证服务。

身份验证可以完全委托给single-sign-on服务,比如 OAuth,OpenID或者角色( 必需 BrowserID ),其中另一个提供程序处理收集凭据。 这将问题推到一个可信的第三方。 Twitter 是一个OAuth提供商的例子,而Facebook提供了类似的专有解决方案。

MUST-READ关于站点身份验证的链接

  1. OWASP指南Authentication身份验证
  2. 'Web上客户端身份验证的ts ( 非常易读的MIT研究论文) ) 和 don
  3. Charles坚持miller登录Cookie最佳实践
  4. 维基百科:HTTP cookie
  5. 用于回退验证的个人知识问题: Facebook ( 非常易读的伯克利研究论文) 时代的安全问题

确定文章

正在发送证书

安全发送凭据 100%的唯一实用方法是使用 SSL 。 使用JavaScript散列密码是不安全的。 client-side密码哈希的常见陷阱:

  • 如果客户端和服务器之间的连接未加密,那么你所做的一切都是易受man-in-the-middle攻击的攻击。 攻击者可以替换传入的javascript来破坏散列或者发送所有的凭据到他们的服务器上,他们可以监听客户端响应,而 等等 等等 SSL是用来防止MitM攻击的。
  • 服务器接收的哈希密码是不太安全的如果你不在服务器上做额外的冗余操作。

有另一个安全的方法叫 SRP,但它是专利( 尽管它是自由许可的 ), 很少有良好的实现。

存储密码

不要将密码作为明文存储在数据库中。 即使你不关心自己站点的安全性。 假设你的一些用户将重新使用他们的在线银行账户的密码。 因此,存储哈希密码,并丢弃原始的。 确保密码不在访问日志或者应用程序日志中显示。 最佳散列函数似乎是 bcrypt

自己的哈希也不安全。 例如相同的密码意味着相同的hashes--this使得哈希查找表可以一次破解大量密码。 相反,存储的salted散列。 salt是在散列之前附加到密码的字符串- 每个用户使用一个不同的( 随意) salt 。 salt是公共值,所以你可以将它们与数据库中的哈希一起存储。 在这里查看 ,了解更多关于这里的信息。

这意味着你不能向用户发送他们忘记的密码( 因为你只有哈希) 。 除非你已经验证用户( 用户必须证明他们能够读取发送到存储的电子邮件( 并验证) 电子邮件地址,否则不要重设用户密码。)

安全问题

安全问题是不安全的- 避免使用它们。 为什么任何安全问题都有,密码会更好。 阅读 第三部分: 使用秘密问题在 @Jens 罗兰回答在这个wiki。

会话 Cookies

用户登录后,服务器向用户发送会话 cookie 。 服务器可以从cookie中检索用户名或者标识,但是其他人无法生成这样的cookie ( TODO解释机制) 。

Cookies 可以被劫持: 它们和客户端和其他通讯的机器一样安全。 它们可以从磁盘读取,在网络流量中嗅探,通过cross-site脚本攻击提升,phished来自一个中毒的DNS,这样客户端就把他们的Cookies 发送到错误的服务器。 不发送持久的Cookies 。Cookies 应该在客户端会话( 浏览器关闭或者离开你的域) 结束时过期。

如果你想自动登录你的用户,你可以设置一个持久 cookie,但它应该与 full-session cookie不同。 你可以设置一个额外的标志,用户有 auto-logged,并且需要登录以进行敏感操作。 这对于那些想为你提供无缝,个性化的购物体验但仍然保护你的财务细节的购物网站来说很流行。 例如当你返回Amazon时,他们会向你显示一个看起来像你登录的页面,但是当你去下订单时,他们会要求你确认你的密码。

另一方面,金融网站( 如银行和信用卡) 只有敏感数据,不允许auto-login或者low-security模式。

外部资源列表

首先,一个强烈的警告是这个问题不是最适合这个问题的。 肯定不是最顶级的答案 !

我将继续提到提议的mozilla BrowserID ( 或者更确切地说,验证的电子邮件协议 ),本着寻找升级路径的精神,在未来找到更好的身份验证方法。

我将以此方式总结:

  1. mozilla是一个非营利 值对齐和找到好的解决这个问题。
  2. 今天的现实是大多数网站使用form-based认证
  3. Form-based身份验证有一个很大的缺点,它增加了仿冒站点的风险。 用户被要求输入敏感信息到一个由远程实体控制的区域,而不是由他们的User Agent ( 浏览器) 控制的区域。
  4. 由于浏览器是隐式信任的( User Agent的整体思想是代表用户),它们可以帮助改善这种情况。
  5. 在这里保持进度的主要力量是部署死锁 。 解决方案必须分解为一些步骤,这些步骤对自己的。
  6. 表示内置在互联网基础结构中的标识的最简单的分散方法是域名。
  7. 作为表示身份的第二个级别,每个域管理自己的一组帐户。
  8. 表单"帐户 @ 域"是简洁的,并且支持多种协议和URI方案。 当然,这样的标识符最普遍地被公认为电子邮件地址。
  9. 电子邮件提供程序已经是de-facto主身份提供程序联机。 当前密码重置流程通常允许你控制一个帐户,如果你可以证明你控制了帐户电子邮件地址的关联。
  10. 经过验证的电子邮件协议提供了一种基于公钥加密的安全方法,用于简化向域证明你在域上拥有帐户的过程。
  11. 对于不支持验证的电子邮件协议( 目前所有这些)的浏览器,Mozilla提供了一个 shim,它在 client-side JavaScript代码中实现协议。
  12. 对于不支持验证的电子邮件协议的电子邮件服务,协议允许第三方充当可信中介,断言他们已经验证了帐户用户的所有权。 有大量这样的第三方是不可取的;这个功能只允许升级路径,而电子邮件服务本身就能提供这些断言。
  13. Mozilla提供他们自己的服务来充当这样一个受信任的第三方。 服务提供商( 也就是说依赖方) 实现验证的电子邮件协议可能会选择信任mozilla或者不信任。 mozilla的服务使用传统的发送电子邮件的方式验证用户的帐户所有权。
  14. 当然,服务提供商可以将这里协议作为一个选项提供,除了他们可能希望提供的其他身份验证方法。
  15. 这里需要的一个很大的用户界面好处是"标识选择器"。 当用户访问一个站点并选择身份验证时,他们的浏览器会向他们显示一个选择的电子邮件地址("个人","工作","",等等 ) 他们可以用来标识自己的站点。
  16. 另一个用户界面利益寻求作为这项工作的一部分是帮助浏览器知道更多关于用户的会话——他们是谁在目前签署,主要,所以它可能在浏览器中显示 Chrome 。
  17. 由于这个系统的分布式特性,它避免了 lock-in,Twitter,谷歌,等等 等主要站点,任何个人都可以拥有自己的域,因此充当自己的身份提供者。

这不是严格的"网站的form-based身份验证"。 但这是一个从当前的form-based认证规范转换到更安全的工作的努力: browser-supported身份验证。

我只是想分享这个解决方案,我发现它工作得很好。

我把它叫做虚拟字段 ( 虽然我没有发明这样的东西,但也不相信我) 。

简而言之:你只需要插入这 <form> 和检查它是空的时验证:


<input type="text" name="email" style="display:none"/>

关键是要欺骗机器人将数据插入一个必需的字段,这就是为什么我叫输入"电子邮件e"。 如果你已经有一个领域叫电子邮件,你是使用你应该命名虚拟字段别的像"公司""电话"或者"合作伙伴地址"。 挑一些你知道你不需要,什么听起来像是人们通常会找到逻辑向web表单填写。 现在隐藏 input 字段使用css或javascript/jquery-任何适合你最好只是设置输入 typehidden 或其他机器人不会上当。

当你验证表单( 客户端或者服务器端) 检查如果你的虚拟字段被填充,以确定是否被人类或机器人发送。

例如:

对于人类: 用户将看不到虚拟字段( 在我的例子中"电子邮件"),并且不会尝试填充它。 因此当表单被发送时,虚字段的值仍然是空的。

对于机器人:text 机器人将看到一个字段的类型和名称 email ( 或者不管你叫它什么) 并将逻辑试图适当填充数据。 它不介意你和一些花哨的css样式输入表单,web-developers一直都这样做。 不管虚拟字段中的值是什么,只要它大于 0 字符,我们就不在乎它。

我用这个方法结合 CAPTCHA留言板,我还没有看到一个垃圾邮件发布。 我以前曾使用过CAPTCHA-only解决方案,但最终导致每小时有五个垃圾邮件日志。 在表单中添加虚拟字段已经停止( 至少到现在为止) 所有的垃圾邮件出现。

我相信这也可以在登录/认证表单中使用。

警告: 当然这个方法不是 100%傻瓜证明。 机器人可以编程以忽略输入字段,它的样式 display:none 应用于它。 你还必须考虑使用某种形式的auto-completion ( 像大多数浏览器都内置了) 为它们auto-fill所有表单字段的人。 他们可能也会选择一个虚拟的字段。

你也可以改变这一点离开虚拟字段可见但边界外的屏幕,但这是完全取决于你。

有创意 !

我不认为以上答案是"错误"但有大面积的认证不了( 或者强调的是"如何实现cookie会话",不在"什么选项可用,哪些权衡"。

我建议的编辑/回答是

  • 问题更多地在于设置而不是密码检查。
  • 使用两个因素authenitication比更聪明的密码加密更安全
  • 不要试图实现你自己的登录表单或者数据库存储,除非存储的数据在创建和self-generated时没有价值( 即,像Facebook这样的2.0风格,Flickr,等等 )

    1. 摘要认证是所有主流浏览器和服务器都支持的一种标准方法,即使在安全的通道上也不会发送密码。

这避免了任何需要"会话"或者 Cookies的浏览器本身每次都会re-encrypt通信。 这是最"轻量"开发的方法。

但是,我不推荐,除了公共的低价值服务。 这与上面的一些问题有问题- 不要尝试 re-implement server-side authetication机制- 这个问题已经解决并被大多数主流浏览器支持。 不要使用 Cookies 。不要在你自己的hand-rolled数据库中存储任何内容。 请求每个请求,如果请求是 autheticated 。 所有其他的都应该由配置和第三方可信软件支持。

那么。。

首先,我们混淆了账户( 使用密码)的初始创建和密码的re-checking 。 如果我是Flickr并首次创建你的站点,新用户可以访问零值( 空白的网站空间) 。 我真的不在乎创建账户的人是否在说谎。 If I am creating an account of hospital Intranet/extranet, value lies in all medical records, and so I do care about identity ( * ) of account creator.

这是最难的部分。 只有的解决方案是一个信任站点。 比如,你作为医生加入医院。 你可以创建一个包含照片,护照号码和公钥的网页,并使用私钥将它们全部散列。 然后你访问医院,系统管理员查看你的护照,查看照片是否与你匹配,然后用医院私钥散列网页/照片散列。 从现在起我们可以安全地交换密钥和令牌。 任何信任医院( 这是秘密秘诀)的人。 系统管理员还可以给你一个 RSA dongle或者其他two-factor身份验证。

但这是一个很多的麻烦,而不是web 2.0非常。 但是,这是创建新帐户的唯一安全方法,它可以访问不是self-created的有价值的信息。

  1. Kerberos和 SPNEGO - 带有可信第三方的单点登录(Single Sign-On) 机制- 基本上是用户根据可信第三方验证。 ( 这并不是不受信任的OAuth )

  2. SRP - 在没有可信第三方的情况下进行明智的密码验证。 但在这里,我们进入了"使用两个因素认证的领域",即使这更昂贵"

  3. SSL 客户端端- 给客户端一个公钥证书( 在所有主流浏览器中支持- 但在客户端机器安全方面引发问题) 。

最后这是一个权衡-什么是安全漏洞的成本 vs的成本实现更安全的方法。 有一天,我们可能会看到一个适当的PKI 被广泛接受,因此没有更多的滚动认证表单和数据库。 有一天。。

另请参阅 Wikibooks PHP编程: 用户登录系统 。

当散列时,不要使用快速散列算法,比如 MD5 ( 存在许多硬件实现) 。 使用类似SHA-512的东西。对于密码,较慢的哈希比。

创建哈希的速度越快,任何蛮力检查器都能工作得越快。 因此较慢的哈希会减慢野蛮强制。 一个缓慢的哈希算法将使野蛮的密码( 8 位+ ) 变得不实际

我最喜欢的认证系统规则是: 使用密码短语,而不是密码。容易记住,难以破解。 更多信息:编码恐怖: 密码 vs Pass短语

关于真实密码强度估算的一篇好文章是:

真实密码强度估计

...