如何为rest API唯一标识您的Android应用程序

如何为rest API唯一标识您的Android应用程序,android,restful-authentication,Android,Restful Authentication,有没有一种方法可以在Java代码中唯一标识我的Android应用程序?也许是包名和其他东西的组合?我知道有一种方法可以识别一个独特的Android,但这不是我想要的 我希望能够唯一地识别我制作的Android应用程序,这样我就可以将这些信息传递给我自己的私有RESTful API。这将允许我验证呼叫是否来自我的Android应用程序,而不是另一个未经授权的应用程序。我希望我的RESTful API只与我制作的应用程序一起工作,这样就没有人可以欺骗它或未经授权访问它 或者这是不可能的?我只是想知道

有没有一种方法可以在Java代码中唯一标识我的Android应用程序?也许是包名和其他东西的组合?我知道有一种方法可以识别一个独特的Android,但这不是我想要的


我希望能够唯一地识别我制作的Android应用程序,这样我就可以将这些信息传递给我自己的私有RESTful API。这将允许我验证呼叫是否来自我的Android应用程序,而不是另一个未经授权的应用程序。我希望我的RESTful API只与我制作的应用程序一起工作,这样就没有人可以欺骗它或未经授权访问它

或者这是不可能的?我只是想知道像Snapchat这样的应用程序是如何拥有自己的登录名的。显然有什么东西在保护它

您可能需要检查机构。安装应用程序时,您需要对用户进行身份验证,并为应用程序提供种子。 每当应用程序调用Rest服务时,您都会提供一个由该种子创建的一次性密码以及服务参数

OTP解决的最重要的优点是 与静态密码相比,它们不易被重放 攻击。这意味着一个潜在的入侵者试图记录 已用于登录到服务或执行操作的OTP 事务将不能滥用它,因为它将不再被滥用 有效


存在一个开放标准,其中提供了java代码供您开始使用

如果你想从应用程序内部使用谷歌地图,你需要在每个请求中提供一个API密钥。 据我所知,这是相同的机制,他们也用来确定你的应用程序的广告。 此密钥以明文形式传输,因此可以拦截。他们进行欺诈检测以防止误用,因此,如果您的RESTful服务与地图或广告属于同一类型,这就是android应用程序的发展方向

如果您有高价值的数据,如snapchat(来自人的裸体),用户必须提供一个秘密密码来保护连接。如果你想让用户的工作量保持在较低水平,你可以使用facebook或google的身份验证机制


另外,看看它会给你一个很好的主题概述。(特别是授权部分。)

这是一个相当广泛的主题领域,与安卓相比,它与RESTful服务的实际设计更相关。一般来说,RESTful服务的设计理念应该是任何人都可以访问它们,并且您可以创建安全性,以确保您的用户数据是私有的,并且只能由有权访问它的人访问,因为互联网的现实是,一旦端点出现,人们就可以并且将尝试访问它

就我个人而言,我通常最终使用JSON Web令牌(JWT)。您可以在标头中包含由服务器使用用户提供的凭据验证的令牌。这允许您验证凭据并拒绝未经授权的访问,因为它是基于OAuth的,并且包含一些额外的方法来保护服务,包括令牌到期,以便应用程序必须每X分钟/小时/天等更新令牌,以防恶意用户获得令牌。这还为您提供了一种简单的机制,可以直接从令牌中识别当前用户


总之,web服务的本质是一旦暴露,任何与web连接的设备理论上都可以通过欺骗、数据包检查等进行连接,而阻止其仅与应用程序连接的唯一方法是在设备级别进行身份验证,这就需要知道将要连接到服务的每个设备。我认为您需要的是服务级别上的强身份验证。良好的REST API与平台无关,在应用程序和网站之间使用,优先级在请求级别,而不是设备级别。正如其他人所提到的,发送静态标识符并不能确保您只从应用程序获取访问权限

您需要一种在API和应用程序之间创建握手的方法,一种简单但相当安全的方法是拥有一个应用程序和API共享的密钥。当您与API建立初始连接时,您创建一个随机字符串,使用共享密钥对其进行加密,并将该字符串和加密字符串传递给API,然后API使用其共享密钥对随机字符串进行加密,并将其与加密字符串进行比较

例如:

Random String (RS) (generated by the app) = ABCDEFGHIJKLMNOP
Your shared key (SK) = AAAABBBBCCCCDDDD
Encrypt RS with SK to produce....
Your Encrypted string (ES) = WWWWXXXXYYYYZZZZ
向API发送RS和ES,然后API使用相同的共享密钥执行相同的加密。如果加密的字符串不匹配,API将拒绝请求并记录RS,以便不能再次使用
如果它确实匹配,则仍然记录RS,但接受对API的访问。您可以在每次使用应用程序时强制重新验证,也可以在验证已成功完成时发送带有任何进一步API请求的RS,但您必须确保在短时间后暂停RS。

“这将允许我验证调用是否来自我的安卓应用程序,而不是其他应用程序”--否,它不会,因为任何人都可以将相同的信息传递给RESTWeb服务。例如,您可以将包名和公共签名密钥的SHA256散列放入RESTWeb服务的URL中。任何其他人都可以通过检查Web流量找到这些值,并将它们放在REST Web服务URL中的相同位置。@Commonware,即使您使用https?一般来说,是的。Android可以使用任意数量的代理。许多人可以拦截HTTPS。现在,从理论上讲,如果你加入了很多你自己的证书验证逻辑,你可能会让一些人很难成功地窥探HTTPS流量。但是,通过应用程序的反向工程,他们可以禁用证书验证逻辑或JU