我们正在构建一个Android应用程序,它的一个功能是预订出租车服务提供商的驾驶室(比如Uber)。
我们有一个特定于应用程序的用户ID。我们称之为AUID。要预订出租车,应用程序会向服务器发送请求并发送AUID以及其他相关信息(如lat,long等)。如何在服务器端确保请求确实来自正确的用户,并且预订出租车是安全的?在当前形式中,如果第三方知道另一个人的AUID,则第三方可以代表该人预订出租车。
我想到的其中一个解决方案是使用非对称加密。应用程序将保留公钥,服务器将包含私钥。我们不是将用户ID发送到服务器,而是发送加密密钥,其中密钥将是使用公钥加密的AUID +时间戳。然后,我们将使用服务器端的私钥解密消息以获取AUID。如果服务器上的时间戳不在客户端发送的timstamp的特定时间间隔内,我们将拒绝该请求。
这是一种安全的方法吗?这种情况是否广泛遵循其他做法?
答案 0 :(得分:1)
您建议的是明智的:加密客户端应用程序上的AUID并在服务器上进行验证。正如评论所示,SSL至关重要。
问题在于,如果你的应用程序如何加密AUID,那么任何一个专注的人都可以想出它。
您可以通过为每个用户发布单独的加密密钥来大幅降低虚假请求的风险。这意味着如果有人破解了您的代码,他们仍然只能欺骗一个帐户。但是,一旦攻击者反编译您的应用程序,他们理论上可以启动新帐户,获取有效的加密密钥和欺骗请求。
100%可靠性所需要的是某种形式的身份验证,它不会存储在客户端应用中 - 例如iOS上的密码或TouchID或Android M上的指纹api。因此,当用户订购出租车时,他们需要输入您还使用AUID编码并检查服务器的一些信息。该秘密信息未存储在您的应用中,因此没有人可以伪造请求。
要求用户输入密码非常不方便。指纹扫描更容易并且可能是可接受的。您还可以使用信任系统 - 如果用户之前订购过出租车并且一切正常,他们可以在没有特殊身份验证的情况下订购。使用Trust和单独的加密密钥是非常有效的,因为任何试图欺骗请求的人都需要在欺骗之前做一个成功的订单 - 这对他们来说可能太麻烦了。