签署API请求时要包含的内容
本文关键字:包含 API 请求 签署 | 更新日期: 2023-09-27 18:29:38
如果我有一个复杂对象作为API请求发送(例如下面的Order),我应该在生成签名时包括所有属性,还是只使用子集?
我问是因为我不清楚,从其他API的请求参数是平面和简单的
public class Order
{
public string Id { get; set; }
public string ClientIdentifier { get; set; }
public IEnumerable<OrderItems> OrderItems { get; set; }
public long timestamp { get; set; }
public string signature { get; set; }
}
public class OrderItems
{
public string ItemId { get; set; }
public string Name { get; set; }
public IEnumerable<decimal> PriceBands { get; set; }pes
more types
}
and so on ....
您首先需要了解消息的签名阻止了什么,才能了解请求中应包含哪些数据。下面列出了对请求进行签名可以阻止攻击者进行攻击的两件主要事情
- 对于已签名的请求,密码是安全的,攻击者不能使用查询中的信息对另一个请求进行签名。如果攻击者能够看到发送到服务器的请求,这将非常有用
- 攻击者无法在不使签名无效的情况下修改用于生成签名的请求中的任何数据,从而导致请求被服务器拒绝
数字2有一个陷阱。它只帮助保护作为签名一部分的数据。如果您遗漏了任何数据,攻击者可能会更改该数据并发送与您发送的消息不同的消息。这就是为什么在签署请求时需要包含所有请求数据的原因:完整的URI,包括域、标头、查询字符串参数以及任何发布的数据,如XML或JSON。
正如navien在上面的评论中所暗示的,您的问题似乎不是一个直接的OAuth问题:
查看对OAuth流的(相当好的)解释http://hueniverse.com/oauth/guide/authentication/得出的结论是,OAuth请求中的所有参数都需要在签名请求时使用,因为服务器也会使用所有参数(根据定义)来验证签名,所以我的建议是也使用所有参数来签名;)
但是(附带说明):
您的代码显示了一个应该提交的复杂数据结构,因此这引发了更多的问题:如何对数据进行编码以通过HTTP进行传输?服务器实现是什么样子的(它是您自己的实现还是给定的服务)?
假设您将数据序列化为XML或JSON以用作请求参数,那么您将获得数据的"仅一个字符串"。此数据用作请求参数,将完全用于如上所述的签名。
我还建议使用开放源代码OAuth客户端实现。一个开始寻找的好地方是位于的Twitter客户端库页面https://dev.twitter.com/docs/twitter-libraries#dotnet因为Twitter使用OAuth对其API进行第三方访问,并且库(像Hammock这样的OAuth组件)是稳定的。
正如已经指出的,您需要弄清楚要防止哪些攻击。
当您提交的数据是敏感的时,通常的方法是使用HTTPS(SSL)与服务器通信。在这种情况下,您不需要对数据本身进行加密/签名,包括发送JSON在内的任何普通协议都可以
若您想防止未知客户端发布数据,请使用相互SSL,这将允许您限制客户端可以与服务器对话的内容。
如果你想通过HTTP验证数据是否被篡改,请签署整个数据块。。。但是使用现有的SSL连接要正确实现要困难得多。退房http://blogs.msdn.com/b/ericlippert/archive/2011/09/27/keep-it-secret-keep-it-safe.aspx
您可以在签名数据中包括的另一件事(尽管它需要得到API的支持)是UTC时间戳。API将检查提供的时间戳,如果它在过期窗口之外,则请求将无效。此外,由于它包含在计算签名中,因此在不使请求无效的情况下无法对其进行修改。这将有效地延长已签名请求的使用寿命,使其以后不会被攻击者重复使用。