用于国际验证码的字母表

Alphabet to use for international validation code

我们正在寻求生成一个 validation code 供最终客户用来获得访问权限 and/or 验证世界各地的各种场景。代码将在我们的服务器上生成,然后传输并显示在应用程序中,但代码可能需要手动传输给其他 users/persons,通过电子邮件,甚至可能通过 phone。此类代码的示例可以是 ABC123.

我们正在寻找平衡一些问题的验证码中字符的“字母表”:

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

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

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

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

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

从用户体验的角度来看,长度为 9 看起来也不错,因为对于用户而言,您可以将其可视化为 3x3 个字符,易于说出或解释。

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

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