我已经实现了一个 PHP URL API,我从我的 iPhone 应用程序调用它,以便访问我服务器上的某些数据。我不确定如何制作,以便只允许我的应用程序调用 API。到目前为止,我非常简单的解决方案是在 URL 中传递一个密钥,但如果有人愿意,它很容易被捕获,然后被不受欢迎的用户使用。我该怎么办?感谢您的建议。
3 回答
您在使用密钥的正确轨道上,但使用该密钥创建您通过 URL 而不是密钥传递的哈希。服务器具有相同的密钥,并且可以重新创建相同的散列。如果不匹配,则无效。
$key = 'my secret key';
$data_item1 = 'something';
$data_item2 = 'something else';
$random_key = mt_rand(100000,10000000);
$check = sha1($key . $data_item1 . $data_item2 . $random_key);
$submit_data = array(
'data_item1' => $data_item1,
'data_item2' => $data_item2,
'check' => $check,
'checkid' => $random_key
);
服务器与应用程序具有相同的 $key。然后它可以将数据元素提交并运行相同的 sha1 并比较 sha1 结果。您不需要使用您提交的所有数据项来创建 sha1 哈希。重要的部分是从提交中遗漏一些“关键”数据以生成散列。这也验证了数据在传输过程中没有被更改或篡改,因为它充当一种校验和。
随机数据是为了确保每个请求都有不同的哈希,因此更难检测模式。这种方法应该足以阻止随意的黑客攻击。
要求用户名和密码怎么样?
一个简单(但不完美)的方法可能是Basic access authentication。
通过 HTTPS 进行通信。我会让应用程序对服务器进行初步检查。如果服务器以某种方式响应(例如,使用特定的状态代码或响应字符串),则应用程序知道它是合法的。然后应用程序可以将信息发布到 PHP API,并可能使用用户名和密码进行身份验证(或者如果您真的想变得复杂,让服务器在初步检查时返回一个密码并使用该密码对服务进行身份验证)。
通过 HTTPS 进行通信,您可以确保所有内容都已加密。通过进行初步检查,您可以更加确信有人不会创建假 SSL 证书来放置在他们的假服务器上以获取您的身份验证详细信息。然后应用程序安全地完成响应。这个系统更复杂,所以这应该更安全。
顺便说一句,在代码中放置敏感的用户名和密码时要小心。如果有人反编译您的可执行文件,他们可能会看到它们。选择做一些更动态的事情,比如在与服务器进行初步检查后获取密码。