【问题标题】:Alphabet to use for international validation code用于国际验证码的字母表
【发布时间】:2020-09-20 16:44:27
【问题描述】:

我们希望生成一个validation code 供最终客户使用,以获取和/或验证世界各地的各种场景。代码将在我们的服务器上生成,然后传输并显示在应用程序中,但代码可能需要手动、通过电子邮件甚至通过电话传输给其他用户/人。此类代码的示例可能是ABC123。

我们希望在这样的验证代码中为字符找到一个“字母表”,以平衡一些问题:

  • 字母必须在世界范围内都能被识别,这可能会限制我们可以使用的字母/数字/符号
  • 代码必须能够输入,例如客户手机上的应用,因此需要使用本地键盘
  • 由于代码可以通过电话或类似的模拟方式传输,因此最好使用较短的代码以避免错误
  • 某些代码可能在更长的时间内有效,因此我们希望有足够宽的字母表和足够长的代码,以使“蛮力”攻击不是攻击向量
  • 我们可能更喜欢不区分大小写的代码,以避免模拟传输中的混淆

我们最初的想法只是一个例子。 9 位数字,但存在一些关于暴力攻击的担忧,业务方面理想情况下需要更短的代码。移动到例如A-Z 和 1-9(不包括一些容易混淆的字符,例如“O”和 0),字母大小增加到 20+,并且可以使用更短的代码,但是国际用户和他们的手机键盘呢?

总结:我们希望得到一些反馈、想法甚至现有标准,以了解如何从全球可访问的字母表中生成全球可接受、易于输入和传输但仍然安全的代码

【问题讨论】:

    标签: security globalization


    【解决方案1】:

    我无法想象世界各地几乎任何地方的用户都无法输入字母数字代码(即字母和数字,为清楚起见,如您所述,可能省略了一些字母)的场景。然后他们将无法使用大部分互联网。

    至于长度,您应该考虑代码的熵。对于相当安全的代码,您应该有 32 位的熵(很大程度上取决于您预期的蛮力,见下文),而非常安全的是 128 甚至 256 位以上。

    从 20 个字符和 9 个长度的字符集中,熵(当且仅当正确生成时)为 38.9 位 (log2(20^9)),因此可能没问题。但是只有你才能知道你期望的暴力破解速度有多快,这在很大程度上取决于是否可以进行离线暴力破解或者这些将是在线请求。

    从用户体验的角度来看,长度为 9 也不错,因为对于用户而言,您可以直观地将其分组为 3x3 字符,易于表达或解释。

    同样,如果在您的情况下可以使用快速离线暴力破解(您也可以考虑使用专用硬件,如果这是潜在威胁),那么少于 39 位可能是不够的。

    来自 20 个字母且长度为 9 的代码将有 20^9 = 5.12 * 10^11 个可能的值。每秒只有 100 万次猜测,大约需要 6 天的时间来进行全面的暴力破解,但其中大约一半的时间就有很好的机会找到正确的代码。所以这 39 位的熵并不多,如果可以离线的话,像专用硬件(也取决于算法)之类的东西可能会比这快得多。但是,如果它是一个 Web 服务,并且它以某种方式用于第二个身份验证因素,或者一个时间有限的一次性密码或令牌,那么这就足够了。所以简而言之,这取决于您的具体情况,以上是您可以遵循的思路,以确定它是否适合您。

    【讨论】:

    • 感谢您的全面回复。这个验证码有点像第二个因素,所以 20 个字符的字母和 9 的长度似乎是合理的。您的第一段表明 A-Z 和 1-9 将作为全球范围内的输入;我在这个领域没有经验,但会例如中国手机或中东手机有这样的西方字符的键盘设置?世界这些地区的人们是否能够口头表达代码,比如在电话交谈中?
    • 老实说,我在这方面没有太多经验。我相信他们可以输入,否则他们很难使用大多数网站和应用程序。至于他们口头表达有多难-我不知道,也许有更多知识的人会发表评论。不过,在大型国际应用程序中使用字母数字是非常标准的,所以我猜这不是一个大问题。
    猜你喜欢
    • 1970-01-01
    • 2012-01-13
    • 2012-01-14
    • 1970-01-01
    • 2016-12-11
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    相关资源
    最近更新 更多