我必须与两个以上能够与 Google NearbyAPI Connections 完美配合的设备进行通信。现在我需要保护连接,限制对集群网络的访问。 API 公开了一种对设备进行身份验证的方法,该方法与库提供的 token 一起使用,但是 this token is intended to be authorized by two users in the UI 。我需要以编程方式执行此操作,用户不应该执行此操作。
有一种方法可以获取 token 以通过编程方式进行身份验证,可以在 docs 中找到,但它在库中不可用。
我尝试做的事情:
因为我没有看到文档声明的方法可以在不要求用户接受我尝试过的连接的情况下执行此操作:
将 secret 放在端点的末尾
id-secret
因此,每个设备都应该解密该 secret 并验证该信息与注册的信息是否匹配,然后接受连接。但是使用 AES 加密会产生很长的有效负载,这会导致设备不被发现。我还没有尝试过 TDES,因为它应该提供更小的有效负载,但我不确定这是否是可行的方法。接受连接发送 secret ,如果无效则断开连接。 我认为这不是一个好的选择,因为网络将暴露给任何人,并且可能会产生不稳定的行为。
您认为验证设备的好方法是什么? 因为我看到的信息的唯一入口点是端点。
最佳答案
目前,您必须先接受连接,然后立即进行质询/响应。它不是最干净的,但仍然是安全的。
广播身份
我建议向端点名称/信息添加唯一 ID。例如。 “12345:意志”。这样,设备就有了一个可供引用的稳定 ID。为了使这一过程更加安全,您可以对 ID 加盐。例如。 “12:54321:Will”或“${salt}:${hashedId}:${name}”。要解析散列 ID,您必须循环设备上的所有已知 ID 并运行 sha(salt + id).limit(5) 直到其中之一与 hashId 匹配。这样,每次盐旋转时广告都会改变,并且更难跟踪设备。如果您也混淆了名称,则会获得奖励积分。
保护连接
立即接受连接,而不验证身份验证 token 。请勿发送私有(private)信息,因为连接不安全。双方设备都应启动计时器(1~5秒),并向对方发出挑战。挑战应该以某种方式包括身份验证 token 。例如。 privateKey.sign(authToken)。您可能还想在两个方向上进行验证,因此您也可以包含公钥。例如。 localPrivateKey.sign(sharedAuthToken + remotePublicKey)。如果双方在时限内验证通过,则认为连接是安全的。
免责声明:我从事“附近连接”工作
关于java - 如何以编程方式验证连接 API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65243044/