我们正在建立一个验证手机号码的系统。 为实现这一目标,当用户添加他的号码时,我们会向他发送带有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机制处理过期代码。
任何人都有任何建议如何解决这个问题?