OATH 算法实现

v1.1.0 2018-11-23 11:09 UTC

This package is not auto-updated.

Last update: 2024-09-15 04:52:30 UTC


README

OTP代表一次性密码:用作双因素认证的独特代码。此类代码的生成方法已由开放身份验证倡议发布。此包提供了实现这些算法的类。

安装

打开命令行,进入您的项目目录,并执行以下命令以下载此库的最新稳定版本

$ composer require sendinblue/otp "~1"

此命令要求您全局安装了Composer,如Composer文档的安装章节中所述。

OTP

SendinBlue\Otp\Otp是所有OTP实现的基类,这意味着每个实现都将定义以下方法

  • generate:生成OTP值
  • check:检查OTP值,抛出InvalidCodeException
  • getBase32Secret:返回未填充的base32编码的秘密

HOTP (RFC4226)

您可以通过扩展SendinBlue\Otp\Hotp类来处理HOTP值。您必须实现getCurrentIndex方法以返回客户端当前的计数器值。如果您希望算法基于计数器(这可能是您想要的),那么您已经设置好了!如果它是基于序列的,您还必须通过返回给定索引处的序列元素来重写getElement方法。

提供客户端

首先,大多数客户端仅支持基于计数器的HOTP。请务必注意这一点!

您的类将继承getBase32Secret方法,这是最简单的方式:只需显示其返回值,并让用户复制其客户端中的值。请注意,最小的秘密长度为20字节。用户至少需要输入32个字符!

作为更好的替代方案,您可以显示generateQRCodeUrl返回的URL作为二维码,以便由类似于FreeOTP Authenticator的应用程序扫描。请勿使用像Google Chart API这样的公共API生成二维码,因为URL将包含秘密!

重新同步

每当提供有效的HOTP代码时,您的服务器必须递增计数器,而客户端在每次请求新代码时都会递增计数器。这意味着客户端和服务器可能会不同步。为了允许重新同步,check方法允许您作为第二个参数传递一个前瞻值,并将返回服务器计数器与客户端之间的差异。请注意,此值越大,代码的安全性越低。

TOTP (RFC6238)

TOTP比HOTP更易于使用,因为计数器是时间依赖的,这意味着您可以直接使用SendinBlue\Otp\Totp类。您可以看到其构造函数提供了许多配置选项,但不幸的是,默认值可能是您唯一会使用的选项,因为一些应用程序仅支持这些默认值。

HOTP和TOTP之间的唯一区别将涉及重新同步:使用TOTP的客户端也可能比服务器晚,因此您可以将前瞻值和回溯值传递给check方法。因此,它可以返回一个负值。

OCRA (RFC6287)

OCRA的开发正在进行中,请参阅ocra分支