5

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

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

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

有问题的问题是PIN。我选择使用随机的 5 个字符 PIN(0-9,az AZ) - 区分大小写。我将删除一些同形文字('I'、'1'、'l'、'0'、'O'、'rn'、'vv'),因此实际的组合数量实际上更少。

我对此有几个问题:

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

6 回答 6

1

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

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

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

于 2011-01-25T10:56:42.377 回答
1

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

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

这种做法是否可以接受?

我认为这是可以接受的,虽然很奇怪。

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

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

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

我不这么认为。

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

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

于 2011-01-25T11:13:54.700 回答
1

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

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

就密码强度而言,这是一个弱密码——我不会将其用作比“分享笑笑猫图片”更强大的任何东西的唯一授权形式——考虑使用更长的密码,否则您的客户甚至可能会意外访问每个其他人的数据(当这种情况发生时,他们往往会非常沮丧:“你的意思是任何人都可以这样看到我的数据?!”)。

于 2011-01-25T11:12:28.187 回答
0
  1. 是的,但这取决于信息的价值,如果信息价值很高并且您认为有人可能试图闯入您应该考虑额外的保护
  2. 如果您要保护的信息具有很高的价值,这可能是一个好主意,在这种情况下,您必须警告用户他的可能性有限,还要创建一个日志文件来监控代码输入失败,并考虑如果用户在 NAT 后面很多用户可能使用相同的 ip(例如办公室或学校的所有用户,也像 fastweb 这样的连接为一大群人使用一个 ip)所以不要阻止 ip长时间(每 3-5 次失败 15-30 秒应该足以避免暴力攻击,您可以在用户第二次失败时加倍),最重要的是,只阻止代码导入而不是整个站点。
  3. 它不是必需的,但你可以实现它,正如我所说,它还取决于信息的价值
  4. 避免代理和爬虫是个好主意,但我推荐一些不同的东西:使用带有“五加 2 =”或“红苹果的颜色是什么?”之类的问题的图像,它们更难理解爬虫,但对用户来说更容易。

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

 AXV2-X342-3420

所以用户应该明白这是一个代码,并且很容易计算剩下多少个字符或者他是否输入了错误的代码。

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

于 2011-04-10T12:05:58.153 回答
0

公理“如果你要推出自己的安全,你已经失败了”,在这里适用。

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

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

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

IP可以被欺骗。

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

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

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

如果你觉得你需要锻炼。验证码已被破坏,除了作为减速带外,其他任何东西都没有用。

更新

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

安全始终是一种权衡

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

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

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

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

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

于 2012-10-03T17:47:21.740 回答
0

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

于 2011-01-25T10:48:15.270 回答