MFA

一、MFA 是什么

MFA(Multi-Factor Authentication,多因素认证) 是一种提高账户安全性的认证方式。 它要求用户在登录或进行敏感操作时提供 多种不同类别的验证因素,从而增强安全性。

通常 MFA 包含三类因素:

因素类型描述示例
知识因素(Something you know)用户知道的信息密码、PIN
持有因素(Something you have)用户拥有的物品手机验证码(OTP)、硬件密钥
固有因素(Something you are)用户自身的特征指纹、面部识别、虹膜识别

核心理念:仅凭密码不安全,增加第二甚至第三因素可以有效防止账号被盗。

二、常见应用场景

  • 金融系统
    登录网银或支付系统时,需要输入密码 + 手机短信验证码。

  • 企业内部 SSO / VPN 登录
    员工登录内部系统时,需要密码 + 动态令牌或硬件钥匙。

  • 云服务 / SaaS 平台
    如 GitHub、Google、AWS 等,用户可启用 MFA 提高账户安全。

  • 敏感操作验证
    修改密码、提现或支付等操作,需要额外的 MFA 验证。

三、MFA 的典型流程(以 TOTP 为例)

  • 绑定 MFA

    • 用户登录后扫描二维码绑定 MFA(生成密钥),服务器存储密钥。
  • 生成动态验证码

    • 用户通过 App(Google Authenticator、Authy)生成 6 位一次性验证码。
  • 登录验证

    • 用户输入账号 + 密码 + 动态验证码。

    • 服务器验证密码和 TOTP 是否匹配。

  • 登录成功

    • 验证通过后生成 Session 或 JWT,用户完成登录。

四、PHP 实现示例(TOTP)

4.1 安装依赖

composer require pragmarx/google2fa

4.2 生成密钥并绑定用户

use PragmaRX\Google2FA\Google2FA;

$google2fa = new Google2FA();

// 生成密钥
$secretKey = $google2fa->generateSecretKey();

// 存入数据库 user.mfa_secret
echo "请扫描二维码绑定 MFA: ";
$inlineUrl = $google2fa->getQRCodeInline(
    'YourCompany',       // 公司或应用名
    'user@example.com',  // 用户标识
    $secretKey
);

echo '<img src="' . $inlineUrl . '" />';

4.3 验证动态验证码

$oneTimePassword = '用户输入的6位动态码';

if ($google2fa->verifyKey($user->mfa_secret, $oneTimePassword)) {
    echo "MFA 验证成功";
} else {
    echo "MFA 验证失败";
}

4.4 中间件验证 MFA

(Hyperf)

public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
    $mfaCode = $request->getHeaderLine('X-MFA-Code');

    if (!Google2FA::verifyKey($user->mfa_secret, $mfaCode)) {
        return new \Hyperf\HttpMessage\Server\Response(401, [], 'MFA required');
    }

    return $handler->handle($request);
}

每次访问需要 MFA 验证的接口时,前端在请求头中带上 X-MFA-Code 即可。

五、MFA 与 JWT / OAuth2 结合

  • 登录阶段:验证密码 → 验证 MFA

  • Token 生成阶段:验证通过后发放 JWT 或 OAuth Access Token

  • 接口访问阶段:JWT 或 Access Token 依然生效,不需要每次验证 MFA

这样兼顾 安全性用户体验

六、结语

  • MFA 是现代应用提高安全性的重要手段,防止密码泄露导致的账户被盗。

  • 常见方式包括 TOTP、短信/邮箱验证码、硬件令牌、指纹/面部识别。

  • 在 PHP 中可使用 pragmarx/google2fa 等库快速实现 TOTP MFA。

  • MFA 可与 JWT、OAuth2 等认证体系结合,实现企业级安全登录方案。