【问题标题】:PHP client PIN securityPHP 客户端 PIN 安全性
【发布时间】:2011-01-25 10:41:19
【问题描述】:

我目前正在开发一个系统,该系统具有一个功能,客户可以通过提供 PIN“号码”来查看他们的购买/续订/等详细信息。

由于我们所针对的客户类型,使用的是 PIN 码而不是登录信息。 PIN 印在发送给他们的文件上。

他们提供 PIN 时显示的视图不会显示高度敏感的信息,例如信用卡等,而是不太敏感的信息,例如产品名称、类型、价格、条形码、维修等。

问题在于 PIN。我选择使用随机的 5 个字符 PIN(0-9,a-z A-Z) - 区分大小写。 我将删除一些homoglyphs ('I','1','l','0','O','rn','vv'),因此实际组合的数量实际上更低。

对此我有几个问题:

  1. 这种做法可以接受吗?
  2. 我是否应该编写一个锁定机制来“禁止”来自具有大量失败尝试的 IP 的流量?*
  3. 我应该编写一个错误检查系统(类似于 Luhn 的信用卡号码算法)吗?
  4. *我应该使用验证码系统吗?

【问题讨论】:

  • 嗯,这取决于。你的威胁模型是什么?您在保护 Timmy 的 MsPaint 涂鸦或银行账户吗?您预计有多少用户?
  • @Piskvor - 你读过这篇文章吗???我在第二段中准确地描述了这一点。
  • @Christian Sciberras:是的,我认为“这可以接受吗?”提出“安全级别”的问题?其余的都是这样。
  • @Piskvor - “这是可以接受的”是在“有人真的在外面这样做吗”。
  • @Christian Sciberras:今天早上我可能有点慢,因为我不明白这有什么关系。人们在那里以明文形式存储密码;我希望这种可憎的事情发生的事实不会让人接受。人们做疯狂的事情。但是对于一项没有任何重要风险的服务(例如,不是金钱或暴露敏感数据),使用随机生成的五个字符的密码是可以的。

标签: php captcha luhn lockout


【解决方案1】:

至于验证码和锁定 - 我会选择验证码,并延迟 1)验证码失败的客户端,以及 2)无效登录:在检查之前,第一次尝试休眠 1 秒,第二次尝试 2 秒,第三次尝试 4 秒, 8 秒后。这不会过多地给普通用户带来不便,但会显着减慢攻击者的速度。不管你做什么,人们弄错 - 没必要彻底禁止他们。

校验和 - 可能作为第 6 个字符用于检测打字错误,而不是为了安全。

就密码强度而言,这是一个弱密码 - 我不会将其用作only 任何比“分享笑笑猫图片”更强的授权形式 - 考虑更长一个,或者您的客户甚至可能不小心访问了彼此的数据(当发生这种情况时,他们往往会真的不高兴:“你的意思是任何人都可以看到 我的这样的数据? !”)。

【讨论】:

  • re:校验和,是的,就是这个想法。 re: 密码,多长时间呢? 6 给出了大约 56,800,235,584(560 亿)个组合。
  • @Christian Sciberras:我至少会选择 8 个(+ 可能的校验位);由于您已经消除了同形文字,即使对于最不精通技术的用户来说,这也不应该是太大的问题。如果可以,请确保字体清晰易读且易于区分字符。
【解决方案2】:

正在使用 PIN 码而不是登录名 由于类型的信息 我们的目标客户。 PIN 印在发送给他们的文件上。

很奇怪,但是可以这样写。我认为你真的应该重新考虑是否真的有必要。但是,如果我理解正确,您是通过 snailmail 发送文件的吗?例如,是否可以向用户发送 PIN,然后让他们登录 openID(LightOpenID)。我会将其锁定为 Google 的 OpenID 提供商,因为这些帐户是“安全的”。这样,您就增加了另一层安全性。谷歌也使用验证码来验证帐户(使其 “安全”)。

这种做法可以接受吗?

我觉得可以接受,虽然很奇怪。

我应该写一个锁定机制来 “禁止”来自具有大量 IP 的流量 失败的尝试次数?*

我认为你应该编写一个锁定机制,因为暴力破解密码已经很容易完成,但是暴力破解 PIN 可以毫不费力地完成。虽然我不认为你应该通过 IP 来做,因为最终用户可能坐在路由器后面,然后他会被阻止。黑客也可能有一个僵尸网络来执行这些类型的攻击。 感谢stackoverflow.com,我今天读到了HashCash,我也发现它很有趣。也许你可以用它来保护自己免受攻击。

我应该写一个错误检查 系统(类似于 Luhn 在 信用卡号)?

我不这么认为。

我应该使用验证码系统吗?

防止自动攻击的唯一真正方法是验证码,所以我认为你应该这样做。 Google/Twitter/etc 不使用 CAPTCHA,因为它们对用户友好,而是因为这是阻止自动攻击的唯一有效方法。如果您要使用来自 Google 的 OpenID 来实现我的系统,那么您可以跳过这一步,因为 Google 已经为您服务了。

【讨论】:

  • 我不知道你们在谈论什么蜗牛邮件。 :) 基本上,购买物品的人会收到一份保证文件,上面有他们的 PIN。以为我对使用 OpenID 特别不感兴趣(请记住,这些客户甚至可能不知道如何使用电子邮件)。但我喜欢提到 light openid(听起来很有趣)。
  • @Christian 我仍然不知道您是如何向他们发送 PIN 码的?是通过蜗牛邮件/邮政吗?我知道他们可能不知道如何使用电子邮件。您刚刚向他们发送了一个带有 vid 的 tinyurl,说明他们应该创建一个 google 帐户。作为旁注,我敢打赌,如果用户在线查看此类信息,他们将拥有 Google 帐户,他们将被重定向到 google,因此该过程也非常简单(如果您不与白痴打交道,也可以创建 google 帐户) .你应该看看 lightopenid 的 google openid implementation => tinyurl.com/63oslzc.
  • 如果他们有,我会发送一封电子邮件,否则,它是通过邮寄或手动(在商店本身)。
  • @Alfred:“如果你不是在和白痴打交道”——这是一个慷慨的假设,因为任何涉及到点击的事情都会使用户的智商暂时减半(根据我今天早上的经验,我们开发人员不是当我们是用户时,不受此规则的约束;))。实际上,“您需要一个 Google 帐户”恕我直言有点高。
  • @Piskvor 来自 JainRain => janrain.com/blogs/…
【解决方案3】:

首先,不仅要提供 PIN 码,还要添加一些客户知道的简单信息,例如在蜗牛邮件系统中,您经常需要提供邮政编码。这样就可以分出不知道“共享秘密”的人。

验证码,如果它不是很烦人的话是有道理的,因为它有助于减少机器人的“猜测”尝试。正如 Stefan 所提到的,由于共享 IP,IP 禁止是有问题的。

当表单发布错误时,您还可以根据您的错误检查实施某种“焦油坑”,例如您延迟了传入连接的处理。简单的算法错误检查可帮助您避免对给定 PIN 进行无用的数据库查找。

【讨论】:

  • +1 用于 tar 坑 - 合法用户不会关心他的第 5 次尝试需要 10 秒而不是 0.01 秒,机器人会受到严重阻碍。
  • 所以,基本上,如果 PIN 码错误,我会先sleep(10);,然后再进行任何输出。当然,如果攻击者知道这一点,他只会杀死更长的连接并假设失败。但是我们不要告诉他这个:)
  • @Christian Sciberras:实际上,如果 PIN 码错误,sleep 就在您验证来自同一来源的下一次尝试之前。这样,攻击者就不会从响应时间中学到任何东西。
  • 我怎么知道下一个?我的意思是,我如何跟踪失败的尝试?也许是 IP=> 尝试对的服务器端表?
  • @Christian Sciberras:根据我的经验,除了 DoS 攻击外,TCP 并不常见(因为很难欺骗有状态的连接)。有人可能会通过匿名代理,或使用僵尸网络,但防范这种情况是 IMO 超出尽职调查的方式。由于 80/20 规则,即使是这样简单的节流机制也会减慢大多数攻击者的速度(阅读“s|
【解决方案4】:

1) 是的,不过取决于目标受众。 2)有时它是有意义的,有时它由于系统的使用方式以及共享IP号上有多少客户端而不起作用。 3)它会增加什么价值?这不会帮助人们试图找到一个有效的 PIN 码吗? 4) 取决于目标受众,以及什么样的验证码。

【讨论】:

  • 客户端在同一 IP 上的概率非常低 - 客户端是普通的 Web 用户(与公司 LAN 不同)。但是,再想一想,它们都是本地的,这可能取决于我们当地的 ISP。至于验证码,是为了避免人们运行自动化工具。
【解决方案5】:
  1. 是的,但这取决于信息的价值,如果信息价值很高并且您认为有人可能试图闯入您应该考虑额外的保护措施
  2. 如果您要保护的信息具有很高的价值,这可能是个好主意,在这种情况下,您必须警告用户他的可能性有限,同时创建一个日志文件来监控代码输入失败并考虑如果用户在 NAT 后面,很多用户可能使用相同的 ip(例如办公室或学校的所有用户,也像 fastweb 这样的连接为一大群人使用一个 ip)所以不要阻止ip 很长一段时间(每 3-5 次失败 15-30 秒应该足以避免暴力攻击,每次用户第二次失败时都可以加倍),最重要的是,只阻止代码导入而不是整个站点.
  3. 它不是必需的,但你可以实现它,正如我所说,它还取决于信息的价值
  4. 避免代理和爬虫是个好主意,但我推荐一些不同的方法:使用带有“五加 2 =”或“红苹果的颜色是什么?”之类的问题的图像,它们更难被爬虫理解,但对用户来说更容易理解。

我还建议您使用 mt_rand() 来随机化 pin(比默认随机更有效,它在统计上是正确的随机并且默认集成在 php 中),同形字删除应该是避免错误输入的好方法但我也可能建议使用

之类的分隔符创建更长的代码
 AXV2-X342-3420

所以用户应该明白这是一个代码,并且可以轻松计算剩余的字符数或者他是否输入了错误的代码。

我可能会避免区分大小写的 pin,因为大写字符更容易阅读,即使您清楚地写明代码区分大小写,有些用户只会将其粘贴为小写或大写。

【讨论】:

    【解决方案6】:

    “如果您要推出自己的安全性,you've already failed”的公理在这里适用。

    对于您的 5 个字符 [0-9, A-Z, a-z] 引脚,您生成的熵少于 8.27 位 (64 310 = 2^n) . [固定]

    攻击者只需不到一天的时间(每秒 1,000 次猜测,which is very slow)就可以破坏您的系统。这可以接受吗?也许对于绕过安全性影响很小的微不足道的系统。

    我是否应该编写一个锁定机制来“禁止”来自具有大量失败尝试的 IP 的流量?

    IP 可以被欺骗。

    我应该写一个错误检查系统(类似于 Luhn 的信用卡号码算法)吗?

    这实际上会减少熵中的位数,从而更容易侵入您的系统。

    我应该使用验证码系统吗?

    如果您觉得需要锻炼。 Captchas have been broken 并且除了作为减速带之外没有任何用处。

    更新

    不幸的是,对于计算机安全,没有一刀切的解决方案,因为它仍然是一个不成熟(不成熟?)的领域。任何说“哦,做这个,你会没事的”的人都在跳过与安全相关的最基本问题之一。

    安全始终是一种权衡

    无法访问最终安全的系统。另一方面,最终可访问的系统没有进入障碍。显然,这两个极端都是不可接受的。

    作为软件开发人员,您的工作是找到两者之间的最佳平衡点。这取决于几个因素:

    1. 用户的技术专长
    2. 您的用户愿意忍受安全问题
    3. 实施和维护的成本(时间和金钱)(即,更复杂的系统将产生更多的支持电话)
    4. 后膛对您的用户和公司的影响
    5. 后膛的可能性:你是美国国防部吗?签证?你现在可能受到攻击了。 Bob's Bicycle Shop 位于加利福尼亚州 Ojai 的另一端。

    根据您的问题,我认为您正在有效地为他们生成“密码”。如果你把它翻转过来怎么办?将 pin 作为他们的帐户,当他们第一次登录您的系统时,他们必须创建一个密码*,从那时起就需要该密码。

    *是的,如果这是一家银行,那么这不是一个好主意。

    【讨论】:

    • 首先,我很确定您的意思是“公理”,对吗?其次,这句话的谬误很明显——如果没有人被允许(或应该/可以)推出他/她自己的安全措施,则意味着一开始就没有任何选择。第三,你在这里漏掉了一点:别针系统不是一种选择,我只是在请人们讨论它,也许会提出改进建议。作为一名软件开发人员,“自己动手”正是我应该做的事情。我投入了多少研究和努力才是最重要的。
    • 现在,关于主题的更多内容。我相信你读了我的问题几次?我在这个项目中关心的是让某人运行一个简短的脚本并获得每个注册人购买的东西的好清单的可能性,而不是访问一个人的购买。考虑到您似乎对这件事很了解,也许您想在这里解决真正的问题:在这种情况下,最好的选择是什么?
    • 你说“滚动我自己”正是我应该做的,作为一个软件开发人员,我反驳说:优秀的开发人员编写好的代码;伟大的开发者窃取伟大的代码。那里有很好的,不,很棒的authentication libraries,它们实际上是经过审查、测试和可靠的代码。我建议你使用它们!为了直接回答你的问题,我会更新我的答案。
    猜你喜欢
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多