php - 在安全 API 通信中使用请求签名时防止重放攻击?

标签 php security api signature man-in-the-middle

我一直在阅读 API 通信证券并试图找出构建安全 API 的最佳方法。 我知道 OAuth 等存在,但我也在尝试在此过程中进行 self 教育,而不是依赖于库。

基本上我有一个 Web 服务,用户可以在该 Web 服务中注册 API。他们将获得一个配置文件 ID 和 key ,必须使用它们来构建来自另一个 Web 系统的 API 请求。

API 请求的构建方式与银行类似,发送到 API 的所有输入数据都必须进行排序、计算哈希值,然后将哈希值发送到服务器,如下所示:

// Profile data
$apiProfile='api123';
$apiSecret='this-is-a-good-day-to-be-a-secret-key';

// Input
$input=array();
$input['name']='Thomas Moore';
$input['profession']='Baker';

// To ensure that the order of variables checked and received is the same on both ends:
ksort($input);

// Using serialize() for simplifying things
// http_build_query() is another option, or just placing values in order
$input['hash']=sha1(serialize($input).$apiSecret); 

// Making a request to URL:
// Using file_get_contents() as an example, would use cURL otherwise
$result=file_get_contents('http://www.example.com/api.php?'.http_build_query($input));

// SERVER CALCULATES COMPARISON HASH BASED ON KNOWN SECRET KEY AND INPUT DATA

这真的很好而且很有效。但是!我的问题是潜在的重放攻击。如果有人抢走了这个请求 URL,他们可以再次将其发送到服务器,即使他们无法更改数据本身。

现在我已经阅读了一些有关它的内容,您还应该检查时间或向请求添加一次性使用 token ,但我不确定我到底应该如何执行此操作?随请求发送时间戳真的足够安全吗? (如果时钟有些同步,接收服务器将确保请求是在发出请求的几秒钟内发起的)。

我还可以添加 IP 验证,但这些可能会发生变化,并且可能会被欺骗,这对用户来说会比较麻烦。

我会喜欢这种一次性 token 类型的系统,但我不确定如何做到这一点而不会使 token 生成面临完全相同的重放攻击问题? (我最不需要的就是允许为中间人提供安全 token )。

非常欢迎意见和文章,我一直无法找到可以解答我的具体问题的 Material 。 我想说我的 API 是安全的,而不仅仅是营销说法。

谢谢!

最佳答案

您只需允许通过安全通道 (https) 进行 token 交换,并且每条消息都应该有一个唯一的哈希值。包括时间戳和客户端 IP 等内容。如果您不使用 https,则很容易受到 firesheep 式攻击。

除此之外,您正在正确地进行代币生成和交换。

关于php - 在安全 API 通信中使用请求签名时防止重放攻击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9931022/

相关文章:

php - Laravel 5 注销或 session 销毁

PHP/MySQL 安全 我可以屏蔽与数据库的连接吗?

硬编码参数时的 Java 异常处理

api - 如何使用 google-apps-script 制作媒体推文?

php - 显示多个下拉选择的搜索结果

php - PHP中的对象列表

php - symfony2 无法通过 gmail 发送电子邮件

Azure 默认读取器与内置监控读取器

php - 如何防止PHP中的SQL注入(inject)?

javascript - 根据下拉选择检索数据