我正在为移动应用程序(Cordova)开发Web服务(PHP),Web服务提供了一些REST API。
当前方案:API本身没有身份验证,任何有端点的人都可以发出请求,但在应用程序层,所有操作都需要经过身份验证的用户(用户登录并且接收已经实施的JWT)。
问题:我想保护REST API只供授权客户使用(API KEY?)。
我应该实现类似:公钥和秘密(hmac)吗?
我错了路,我应该使用像oauth这样的东西(*它是私人API *)。
答案 0 :(得分:0)
AWS Cognito是保护Rest API的最佳综合解决方案。请检查https://aws.amazon.com/cognito/
答案 1 :(得分:0)
听起来您想要在添加中向用户验证Cordova应用程序二进制文件,以确保对PHP服务器发出的REST API请求来自合法来源,而不是例如流氓应用程序或脚本最终可以通过反向工程API来抓取后端数据。
OAuth / OpenID流通常用于验证用户,而不是移动应用等软件,重要的是要记住,经过验证的原始用户仍然可以利用假软件利用REST API
您有两种选择:
使用HMAC签署来自移动应用程序的API请求当然是个好主意,但是回想起HMAC函数需要一个秘密和消息作为参数,并且秘密最终必须在内存中以单一形式存在(即使最初被混淆)如果使用不能混淆的内置系统版本的HMAC,可以从移动应用程序中提取。
我强烈建议不要在移动应用中嵌入秘密 - 一旦应用程序在各个商店公开发布,移动应用程序使用的秘密和API都可以通过逆向工程获得。
如果您决定在应用中使用HMAC请求签名方法,那么您一定要实施:
并行,在消息中编码,以允许通知REST API,以便它可以做出保护自己的决定。此外,在本机代码中执行任何这些操作 - 不在Cordova Javascript代码中,因为该层和JS /本机桥接层在移动应用程序中引入了一个弱点。
您提到了"公钥",但在非对称加密(例如RSA)中,该密钥通常用于加密和验证操作。私钥用于解密和签名操作,因此它是您在应用程序中需要的私有密钥。我会从不提前嵌入这个。
您还可以在HMAC消息中包含应用程序的开发人员签名权限,以帮助防止其他人签名的重新打包版本。
带内HMAC API请求签名的另一种方法是使用带外标记化方法,该方法使用JWTs来表示移动应用程序的有效性。您可以在远程软件身份验证服务器上定期执行移动应用程序有效性测试,为移动应用程序提供JWT,该应用程序可以包含在每个REST API请求中。例如,这是Approov所做的事情。
将app 强化(混淆,字符串加密等)与REST API 保护混淆是非常重要的:在前一种情况下,你看到移动应用中的价值;在后一种情况下,您会在REST API后面看到 数据 中的值。
除非您有足够的资源,否则这是一个难以解决的难题,因此我建议使用其他人已解决这些问题的解决方案,以便您可以专注于应用功能,用户体验和上市时间。< / p>
无论您做出什么决定,+1都要积极主动地保护安全,我希望这对您有所帮助,祝您好运!