我认为你将永远无法隐藏的URL由应用程序 叫(我是否正在运行一个根版Android手机,我应该能够窥探所有网络通信)
但你真正的问题是你需要以某种方式验证你的api。
一种方法是实现OAUTH,但也许这是矫枉过正。
如果你想要一个简单的机制,那么这个怎么样;
- 创建秘密密钥
- 构建的API请求(如:https://my.example.com/users/23?fields=name,email)
- 哈希这个请求路径+加你的密钥(例如MD5(网址+ SECRET_KEY)== “a3c2fe167”)
- 该散列添加到您的要求(现在是https://.....?fields=name,email&hash=a3c2fe167)
- 的API结束,做相同的转换(删除散列PARAM)
- 检查URL的MD5和秘密密钥
只要秘密保守秘密,没有人可以伪造你的请求。
例(伪代码):
Android的一面:
SECRET_KEY = "abc123"
def call_api_with_secret(url, params)
# create the hash to sign the request
hash = MD5.hash(SECRET_KEY, url, params)
# call the api with the added hash
call_api(url+"&hash=#{hash}", params)
end
服务器端:
SECRET_KEY = "abc123"
def receive_from_api(url, params)
# retrieve the hash
url_without_hash, received_hash = retrieve_and_remove_hash(url)
# check the hash
expected_hash = MD5.hash(SECRET_KEY, url_without_hash, params)
if (expected_hash != received_hash)
raise our exception!
end
# now do the usual stuff
end
非常感谢,@ matthew-rudy :)我是否为每个用户创建了“密钥”?如果那样,我该如何分配它?如果我在注册后将密钥发送给应用程序作为响应,则可以简单地从他的桌面浏览器进行API调用,并将密钥作为响应。 – giga
在马修的方法中,秘密密钥绝不会通过电线发送。这是一个“盐”,附加到URL来创建一个哈希。由于哈希是单向函数,因此用户无法从中恢复密钥。它需要用户反编译APK并查看源代码以找到密钥。您可以使用代码混淆技术来使这变得更加困难,但只要有足够的时间和动力,人们总能找到钥匙。 –
确实@JasonLeBrun,我添加了一个伪代码示例。但是,千兆,我建议你在PHP中搜索现有的框架,而不是创建自己的框架。我确定必须有许多现有的解决方案。 –