【问题标题】:Cheap alternative to OTP SMS (MFA/2FA) [closed]OTP SMS(MFA / 2FA)的廉价替代品[关闭]
【发布时间】:2021-01-23 07:17:39
【问题描述】:

在我的 Android 应用程序中,我需要将用户的联系人链接到我们的 DB 用户帐户,以便用户可以单击特定联系人,该应用程序会将其转换为我们的内部用户 ID(如果存在),从而使沟通更容易和更友好。

我曾考虑使用 SMS OTP 来验证电话号码(电话号码 -> 内部用户 ID),但结果非常昂贵(估计每月有 150k-300k 新用户)。我们的用户遍布全球。费用为每月 15,000 美元至 40,000 美元。我们买不起。

还考虑从以下位置获取用户的电话号码:

  • Google People API - 需要特殊权限,并且只提供未经验证的“关于我”电话号码。
  • Google Account API - 无法获取电话号码
  • Google 登录 SSO - 无法获取电话号码
  • Facebook 登录 SSO - 无法获取电话号码(已弃用)
  • WhatsApp 的 AccountKit(通过 WhatsApp 的 OTP) - 已弃用
  • WhatsApp API - 非常昂贵,在某些情况下与 SMS 相似,甚至不超过 SMS
  • 从 SIM 卡中提取 - 不可靠,大部分无法正常工作,未验证,可以伪造

是否有任何廉价的替代 SMS OTP 来获取经过验证的电话号码?

谢谢!

【问题讨论】:

    标签: android facebook-graph-api multi-factor-authentication google-sso


    【解决方案1】:

    有一个便宜的 hack(免费)可供您使用,但它可以被用户伪造,假设用户可以控制输入的电话号码。

    因此,只有在您对某些情况下怀有恶意的高级用户感到满意时,您才应该使用它。

    这里的想法是,SMS 发送的成本将转移给用户,而不是您的服务器。如今,在大多数国家/地区,一条 SMS 是免费的,或者在其中一些国家/地区非常便宜,因此“可能会收取运营商费用”之类的免责声明应该涵盖您。

    您需要根据tutorial 实施SMS Retriever API 流程,但是当它说要从您的服务器发送短信时,您应该让用户从他们自己的设备发送短信:

    Intent intent = new Intent( Intent.ACTION_VIEW, Uri.parse( "sms:" + inputNumber)); 
                        intent.putExtra( "sms_body", otpContents); 
                        startActivity(intent);
    

    如果您的应用有权发送短信,则使用SmsManager

    SMS Retriever 流程​​的其余部分应按照教程中的方式进行,允许您的应用验证用户输入的号码是否已由用户发送和接收。

    【讨论】:

    • 有趣的想法,你的意思是从用户发送短信,给用户,然后获取他的号码。正如你所说,它不是防弹的,因此我不能真正使用它,但很好。
    • 取决于您要测试的内容。如果您想验证用户在您的应用中输入的号码属于该用户,则此方法可以工作。如果您尝试验证号码属于用户当前使用的设备,那么它可能会被黑客入侵。但考虑常规 SMS OTP,您是从服务器向电话号码发送 SMS。然后,用户可以从不同的设备读取代码并在当前设备上进行验证,因此它们都可以以类似的方式被黑客入侵
    • 谢谢,不完全是因为攻击者可以写任何电话号码,然后从同一个号码欺骗传入的短信(超级简单),导致欺骗系统,所以我不能保证该号码属于他...谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 2011-06-16
    • 2011-12-17
    • 2010-10-21
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多