用于国际验证码的字母

问题描述

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

我们希望在这样的验证码中找到字符的“字母”,以平衡一些担忧:

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

我们最初的想法只是例如9位数字,但是对于蛮力攻击存在一些担忧,理想情况下,业务方面希望使用更短的代码。移至AZ和1-9(不包括一些容易混用的字符,例如“ O”和0),字母大小增加到20+,并且可以使用更短的代码,但是国际用户和他们的电话键盘呢?

摘要:我们希望就如何从全球可访问的字母表中生成全球可接受,易于输入和传输但仍安全的代码提供一些反馈,想法或什至现有标准

解决方法

我无法想象世界上几乎任何地方的用户都无法输入字母数字代码的情况(即字母和数字,为清晰起见,可能省略了一些字母)。这样一来,他们通常将无法使用大部分互联网。

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

从一个20个字符的字符集和一个9的长度来看,熵(如果且仅当正确生成时)为38.9位(log2(20 ^ 9)),所以可能没问题。但是,只有您能说出您期望的暴力破解速度有多快,这在很大程度上取决于是否可以进行离线暴力破解或这些将是在线请求。

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

同样,如果在您的情况下可以进行快速脱机蛮行操作(您可能还考虑使用专用硬件,如果这是潜在的威胁),那么不足39位可能就不够了。

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