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 等认证体系结合,实现企业级安全登录方案。