如何确保只有授权用户才能访问服务器提供的功能?

How to make sure that only the authorized user can access a feature provided by the server?

我们正在构建一个 android 应用程序,其功能之一是预订出租车服务提供商的出租车(比如 Uber)。

我们有一个特定于应用程序的用户 ID。让我们称之为 AUID。要预订出租车,应用程序会 Post 向服务器发出请求并发送 AUID 以及其他相关信息(如纬度、经度等)。我如何在服务器端确保请求确实来自正确的用户并且预订出租车是安全的?在目前的形式下,如果第三方知道了另一个人的 AUID,则第三方可以代表该人预订出租车。

我想到的解决方案之一是使用非对称加密。应用程序将持有 public 密钥,而服务器将包含私钥。我们将发送一个加密密钥,而不是将用户 ID 发送到服务器,该密钥将使用 public 密钥进行 AUID + 时间戳加密。然后我们将在服务器端使用私钥解密消息以获得 AUID。如果服务器上的时间戳不在客户端发送的时间戳的特定间隔内,我们拒绝请求。

这种方法足够安全吗?对于这种情况,是否还有其他广泛遵循的做法?

你的建议是明智的:在客户端应用程序上加密并在服务器上验证。正如评论所暗示的那样,SSL 至关重要。

问题是,如果你的应用程序中有如何加密AUID,任何足够专注的人都可以弄清楚。

您可以通过为每个用户颁发单独的加密密钥来大大降低虚假请求的风险。这意味着如果有人破解了您的代码,他们仍然只能从一个帐户进行欺骗。但是,一旦攻击者反编译了您的应用程序,理论上他们就可以开设新帐户、获取有效的加密密钥和欺骗请求。

要获得 100% 的可靠性,您需要的是某种形式的身份验证,它不会存储在客户端应用程序中 - 例如 iOS 上的密码或 TouchID 或 Android 上的指纹 api M. 因此,当用户订购出租车时,他们需要输入一些信息,您也使用 AUID 对其进行编码并在服务器上进行检查。该秘密信息不会存储在您的应用中,因此没有人可以伪造请求。

要求用户输入密码非常不方便。指纹扫描要容易得多,也可能是可以接受的。您还可以使用信任系统 - 如果用户之前订购过出租车并且一切正常,他们可以在没有特殊身份验证的情况下订购。将 Trust 与单独的加密密钥一起使用非常有效,因为任何试图欺骗请求的人都需要在能够欺骗之前成功执行订单 - 这对他们来说可能太麻烦了。