我做了一些谷歌搜索,但被大量的信息搞得有些不知所措。到目前为止,我一直在考虑为每个md5调用请求一个有效的API散列,但我意识到劫持这样一个系统并不是一件困难的任务。你们可不可以为我提供一些可能对我的搜索有所帮助的链接?谢谢。
发布于 2010-07-03 11:23:50
首先,考虑一下OAuth。它在某种程度上是当今基于web的API的标准。
第二,其他一些潜在的资源-
下面是一些不错的博客文章:
上一个问题:
发布于 2011-10-27 23:23:15
我想对这个问题补充一些澄清的信息。“使用OAuth”的答案是正确的,但也是加载的(考虑到规范相当长,不熟悉它的人通常在看到它后想要自杀)。
我在这里写了一个故事式的教程,关于在设计安全的REST API时如何从无安全性到基于HMAC的安全性:
这基本上就是所谓的“两条腿的OAuth";因为OAuth最初的目的是验证客户端应用程序,所以流程分为三个部分,包括身份验证服务、用户盯着屏幕和想要使用客户端凭据的服务。
两条腿的OAuth (以及我在那篇文章中详细描述的内容)用于服务API之间的身份验证。例如,这是Amazon Web Services对其所有API调用使用的方法。
要点是,对于通过HTTP的任何请求,您必须考虑一些恶意中间人记录和重放或更改您的请求的攻击矢量。
例如,您向名为'bob‘的/user/create发出一个POST,那么中间人就可以向名为'bob’的/user/delete发出一个POST。
客户端和服务器需要某种方式来相互信任,而唯一可以实现的方式就是通过公钥/私钥。
您不能只是来回传递公钥/私钥,也不能简单地提供一个用私钥签名的唯一令牌(这通常是大多数人所做的事情,并认为这会使它们变得安全),虽然这将标识来自真实客户端的原始请求,但它仍然会让注释的参数有可能更改。
例如,如果我发送: /chargeCC?user=bob&amt=100.00&key=kjDSLKjdasdmiUDSkjh
其中密钥是我的公钥,由我的私钥签名,只有中间人可以拦截这个调用,并将其重新提交给服务器,取而代之的是"amt“值"10000.00”。
关键是您必须在散列计算中包含您发送的所有参数,因此当服务器获得这些参数时,它会通过重新计算自身的相同散列来重新检查所有值。
提醒:只有客户端和服务器知道私钥。
这种验证方式称为"HMAC";它是验证请求内容的校验和。
因为哈希生成非常敏感,并且必须在客户端和服务器上完全相同地执行才能获得相同的哈希,所以对于所有值应该如何组合有非常严格的规则。
例如,当您尝试使用SHA-1对这两行代码进行签名时,这两行代码提供了非常不同的散列: /chargeCC&user=bob&amt=100 /chargeCC&amt=100&user=bob
大量的OAuth规范使用诸如“自然字节排序”和其他非人类可读的垃圾之类的术语详细地描述了这种组合的确切方法。
但是,这一点很重要,因为如果值组合错误,客户端和服务器就不能正确地审查彼此的请求。
你也不能走捷径,只是把所有东西连接成一个巨大的字符串,亚马逊尝试了亚马逊网络服务签名版本1和它的turned out wrong。
我希望所有这些都能有所帮助,如果你被卡住了,请随时提问。
https://stackoverflow.com/questions/3170192
复制相似问题