如何使用令牌生成器实现多因素身份验证?

信息安全 验证 协议 多因素
2021-08-12 01:44:23

我想在几个项目上实施多因素身份验证。

现在第一个因素是用户名和密码,第二个因素我想使用令牌生成器。

这些令牌的长度为 6 个字符,由用户携带的设备(如电话或特殊设备)生成

但是......我不知道令牌生成器是如何工作的以及如何实现它。(所以我是来学习的)

我最终想构建一个手机应用程序来生成令牌和一个用户登录的网站(php)。

谁能给我一些关于这些算法如何工作的正确方向的指示?

4个回答

有很多现有的,它们带有自己的 API。你可以实现任何你想要的算法。看到这个网站。

从头开始绘制,对于断开连接的令牌,您有几个选择。他们可以:

  • 基于计数器 - 每次按下时都有一个新密码,并且身份验证系统不允许任何至少与上次使用的密码一样旧的东西
  • 基于时间的——算法因素在当前时间和服务器不允许除了当前、前一分钟和下一分钟(或可能稍宽的窗口)之外的任何东西;需要良好的时间同步

您需要使用秘密共享值和时间或计数器来播种基于序列的不可预测算法。hash(time . secret)之类的。使用 SHA-256 并砍掉一些位会很有效。

实力对比:

  • RSA 令牌——8 位数字,10 8(亿分之一)
  • 六个数字,10 6(百万分之一)
  • 六个字母数字,2.1x10 9(20 亿分之一)
  • 六个字母数字,带大写:5.6x10 10(560 亿分之一)

也可以看看:

一些重要的辅助设计注意事项。

单用户还是多用户?

如果这是一个只适合您的宠物项目,那么很多支持任务都很容易。但是,如果这是一个多用户系统,那么您需要考虑更多的因素。

统一代币还是个人代币?

统一令牌是为所有用户提供等效身份验证的令牌。也就是说,即使有多个物理设备,任何用户都可以使用任何物理设备进行身份验证。这对支持很方便,但对身份验证很弱。另一方面,每用户令牌只能由指定用户使用。每个用户必须被唯一地分配给不同的物理令牌设备。如果用户丢失或损坏设备,则必须为用户分配新的物理设备。每用户提供更强的身份验证,但操作支持更昂贵。

认证系统参数。

有一些关键参数,例如身份验证失败和下一次身份验证提示之间的延迟。此失败延迟有助于防止攻击者获得用户名和密码但没有有效令牌设备的在线攻击。另一个参数是在帐户被暂时禁用之前失败的尝试次数。添加之前的设置是临时禁用时间。那是在 n 次尝试失败后多长时间应该暂时禁用该帐户。

令牌设备保护

由于令牌设备是一个身份验证组件,令牌设备将成为攻击者的诱人目标。如果您正在考虑使用手机或智能手机,您需要考虑如何保护令牌生成软件免受尝试监控或破坏它的影响。如果您的设备是自定义设备,它将具有哪些通信通道(USB、以太网、RS-232)以及这些通道将如何使攻击者能够分析或修改设备?

我目前正在使用Google Authenticator作为我选择的 OTP 令牌。

如果您对此不熟悉,我建议您阅读OATH Initiative这块地铺得很好,祝你好运!

您想通过散列密钥和计数器(或时间戳)来创建一次性密码。令牌生成器对键和计数器进行哈希处理,将结果截断为 6 个字符,然后递增计数器。服务器做同样的比较。

HOTP是一种带有计数器的常用算法,TOTP是一种使用时间戳的算法。其中一个优点是硬件和软件令牌生成器可供他们使用。

生成令牌是容易的部分;使用该令牌安全可靠地进行身份验证更加棘手。Duo Security具有与我们的双因素服务一起使用的开源客户端,它们可能对参考有用。免责声明,我是 Duo 的员工。