Jos*_*son 6 javascript php rest
我正在使用Phonegap/Cordova编写移动应用程序.移动应用程序需要来自我编写的服务器端应用程序的信息.我创建了一个API来获取这些信息.
API所做的第一件事就是验证移动应用程序是我编写的应用程序.它使用公共API密钥和秘密API密钥执行此操作.(它们用于生成授权标头).
授权标头在移动应用程序和服务器端应用程序上生成,服务器将针对彼此检查它们是否存在差异.
它是这样的:
var SIGNATURE = SHA512( MY_APP + MY_PUBLIC_API_KEY + TIMESTAMP + NONCE + MY_SECRET_API_KEY );
var auth = "path=MY_APP,key=MY_PUBLIC_API_KEY,time=TIMESTAMP,nonce=NONCE,signature=SIGNATURE"
$.ajax( {
type = "POST",
url: url,
headers : {
"Authorization" : auth
}
} );
Run Code Online (Sandbox Code Playgroud)
// there is some regex to "decode" the auth header
// now, recreate the signature from the public variables in the auth header and check for a match (note: this includes fetching the secret from an xml file as it is not in the public information)
Run Code Online (Sandbox Code Playgroud)
问题显然在于我需要秘密API密钥来在客户端生成签名.
在线阅读文章后,很多人都说将这个秘密存储在服务器上(然后使用服务器作为中介),但我相信只有在你使用第三方API时才适用.这也只是将问题从客户端移开.是什么阻止了某人打电话给中间人,这只是秘密就是这样?
一个非常类似的解决方案是将秘密存储在服务器上并在应用程序加载时获取它,但肯定是同样的问题......什么阻止某人简单地去api.mydomain.com/getsecretkey?
在客户端存储秘密是不可行的.特别是有了phonegap.那人们怎么做呢?
任何和所有的帮助表示赞赏.
我认为这里的底线就是:“你做不到”。这项工作是在用户的计算机上完成的,使用的源代码也存在于该计算机上。因此,一个顽固的小偷可以洞悉你所有的“秘密”,而你却无能为力。
您可以向主机添加各种形式的检查,这些检查只是查找每个请求中需要出现的内容,如果不存在此特征,则拒绝响应(甚至“直接丢弃数据包”) 。例如,这将允许您忽略某些脚本小子的机器人向您抛出的“垃圾”请求:他们必须拥有您的客户端应用程序的副本才能弄清楚如何表达他们的请求。正确地传达信息,这自然就意味着“一个更加坚定、不那么随意的小偷”。(互联网上的许多攻击者只是想制造噪音并造成恶作剧,值得您花时间(恕我直言)做一些事情来让您快速忽略这些事情。)