基于固定字符串生成Google2fa机密

时间:2018-01-30 19:31:24

标签: laravel two-factor-authentication

我们正在建立一个验证手机号码的系统。 为实现这一目标,当用户添加他的号码时,我们会向他发送带有6位数代码的短信。

我们不希望这些代码进入我们的数据库,因为我们不喜欢使用没有商业意义的字段来混淆我们的数据库。

所以我们提出了重用pragmarx/google2fa库的想法,让它生成一个OTP代码,通过短信将它发送给用户,然后圆圈就是圆形。

所以基本上我们想要使用电话号码,以某个秘密为前缀作为pragmarx/google2fa库的“秘密”:

$secret = '1263' . $mobile->country_code . $mobile->subscriber;

$google2fa = new Google2FA();
$google2fa->setEnforceGoogleAuthenticatorCompatibility(false);

$google2fa->getCurrentOtp($secret);

上述结果与secret相似12633232970987。但是,对getCurrentOtp的调用会抛出异常Invalid characters in the base32 string.,这显然不是我所希望的。

所以,我尝试添加

$secret = base_convert($secret, 10, 32)

并将其传递给getCurrentOtp方法,但返回了相同的错误。检查库代码,我看到以下常量:

const VALID_FOR_B32 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';

我的base_convert返回一个字符串,其中包含其他字符。这些真的是唯一有效的角色吗?

我的替代方案是让库生成一个随机秘密,但我们并不真的想这样做,因为这需要我们在数据库中的某个地方(或至少在缓存中)保密。我们想避免。我们的想法是,我们可以使用数字作为秘密为移动号码生成代码,并让OTP机制处理过期代码。

任何人都有任何建议如何解决这个问题?

0 个答案:

没有答案