【问题标题】:How to authenticate programatically Connection API?如何以编程方式验证连接 API?
【发布时间】:2020-12-10 22:11:07
【问题描述】:

我必须与两台以上与 Google NearbyAPI Connections 完美配合的设备进行通信。现在我需要保护限制对集群网络的访问的连接。 API 公开了一种对设备进行身份验证的方法,该方法与库提供的令牌一起使用,但是,this token is intended to be authorized by two users in the UI。我需要以编程方式执行此操作,用户不应执行此操作。

docs 中可以找到以编程方式获取令牌进行身份验证的方法,但在库中没有。

我试图做的事情:

因为我没有看到文档声明的一种方法可以在不要求用户接受我尝试过的连接的情况下执行此操作:

  • 在端点的末尾放置一个秘密

    id-secret 所以每个设备都应该解密这个秘密并验证信息是否与注册的匹配,然后接受连接。但是使用 AES 加密会消耗很长的有效载荷,这会导致设备未被发现。我没有尝试过 TDES,因为它应该提供更小的有效负载,但我不确定这是否会是正确的方法。

  • 接受连接发送秘密,如果无效则断开连接。 我认为这不是一个好的选择,因为网络会暴露给任何人,并且会产生不稳定的行为。

您认为验证设备的好方法是什么? 作为我看到的唯一信息入口点是端点。

【问题讨论】:

    标签: java android google-nearby google-nearby-connections


    【解决方案1】:

    目前,您必须先接受连接,然后立即进行质询/响应。它不是最干净的,但它仍然是安全的。

    广播身份

    我建议在端点名称/信息中添加一个唯一 ID。例如。 “12345:威尔”。这样,设备就有了一个可以参考的稳定 ID。为了使这更加安全,您可以对 ID 进行加盐。例如。 “12:54321:Will”或“${salt}:${hashedId}:${name}”。要解析散列 ID,您必须遍历设备上的所有已知 ID 并运行 sha(salt + id).limit(5) 直到其中一个与 hashId 匹配。这样,每次盐旋转时广告都会发生变化,并且更难跟踪设备。如果您也混淆名称,则可以加分。

    保护连接

    立即接受连接,无需验证身份验证令牌。暂时不要发送私人信息,因为连接不安全。两个设备都应该启动一个计时器(1~5 秒),并向对方发出挑战。挑战应该以某种方式包含身份验证令牌。例如。 privateKey.sign(authToken)。您可能还想双向验证,因此您也可以包含公钥。例如。 localPrivateKey.sign(sharedAuthToken + remotePublicKey)。如果双方在时限内验证,则认为连接是安全的。

    免责声明:我在附近的连接上工作

    【讨论】:

    • 我们很快就会公开一个“原始身份验证令牌”,它比当前令牌长得多,并且专为这个确切的用例而设计。如果您使用简短的 5 字符身份验证令牌,恶意设备可能会重复连接到 2 个有效设备,直到其两个连接共享相同的 5 字符身份验证令牌。从那里,它可以在两者之间转发消息以绕过挑战/响应。为避免这种情况,您要么需要通过在约 5 秒内不接受新连接来显式限制连接,要么等待更长的令牌使攻击更加困难。
    • 感谢您的回答!我会试试你的算法。您知道原始身份验证令牌何时发布吗?
    • 希望在一月份。代码已经准备好了,所以我们只是在等待有人腾出时间来推送更新的 SDK。
    猜你喜欢
    • 1970-01-01
    • 2019-09-11
    • 2019-12-04
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    相关资源
    最近更新 更多