我试图找到我的方式,围绕保护身份验证的规范,它的要求及任何实现我可以找到,迄今为止,这似乎是更多的麻烦比它的价值,因为我有麻烦找到一个单一的资源,拉扯在一起。或者也许这只是我在找一些更专门的比大多数的教程。

我有一套现有APIs--某些在爪哇,一些在PHP-我现在需要安全并且,对于一些原因,保护身份验证似乎是正确的路要走。不幸的是,我无法追踪的适当的资源,以帮助我得到一个供应商和运行是具有挑战性的理论。由于大多数这将系统API使用情况,我将需要实现一个2条腿的提供者。铭记这一点...

  1. 任何人都不会知道的任何良好的教程为实现一个2条腿的护身份验证供应商有PHP?
  2. 鉴于我们安全Api2种语言,我是否需要实施一供应商都或是有一种方式来创建供应商作为"前端控制器"我可以用漏斗的所有要求通过?
  3. 在保护PHP服务,例如,我必须保护每个API单独通过包括提供必要的资源,在每个?

谢谢你的帮助。

有帮助吗?

解决方案

我会退后一步,并认为关于什么是正确身份验证客户要送你。

你可以商店的钥匙和证书在一个共同的数据库,该数据库可从这两套服务,而只是实现保护身份验证供应商在一个语言?当用户发送请求到服务(PHP Java)你然后检查对共同商店。当用户是设立保护身份验证客户然后你做了这一切通过PHP Java应用程序(己的偏好),和储存的全权证书的共同数据库。

有一些保护身份验证的提供者以其他语言编写的,你可能想看一下:

其他提示

抢劫,不知道你在哪里登陆上这一点,但想补充我2分情况下,任何人都跑过这个问题。

我或多或少有同样的问题,几个月前听到的关于"保护身份验证"为更好的部分的一年。我是发展中国家的一个剩余API我需要安全,所以我开始阅读有关保护身份验证...然后我的眼睛开始滚倒在我的头上。

我可能给了一个良好的坚实的一天或2略读和阅读直到我决定了,就像你,该保护身份验证是令人困惑的垃圾只是放弃它。

然后我开始研究的方式来安全Api在大,并开始获得一个更好的把握的方式做到这一点。最受欢迎的方式似乎是发送请求API沿用一个校验 整个消息(编码有一个秘密只有你和知道服务器),服务器可用来决定,如果消息已经被篡改过它的方式从客户,像这样:

  1. 客户发送/用户。json/123?showFriends=true&showStats=true&校=kjDSiuas98SD987ad
  2. 服务器获取的所有这,看起来用户"123"在数据库,载他秘密的钥匙然后(使用同样的方法客户使用)的重新计算出它自己的校验给出的请求的论点。
  3. 如果服务器产生的检验和客户发送校验和匹配起来,要求是确定和执行,如果不是,则被视为篡改和被拒绝。

该校被称为HMAC如果你想要一个很好的例子,它是什么样的亚马逊的网服务的使用(他们呼吁参数'签名'不'校'虽然).

所以,鉴于一个关键组成部分的这项工作是,客户和服务器产生的HMAC以同样的方式(否则他们不会相匹配),有必要规定如何将所有的论点...然后我突然明白了所有的"自然的字节顺序的参数"的废话从保护身份验证...这只是限定的规则如何生成签字,因为它需要。

另一点是,每一个参数包括在HMAC代是一个值,然后不能被篡改,当你发送的请求。

所以如果你只进行编码URI干的签名,例如:

  • /用户。json==askJdla9/kjdas+Askj2l8add

那么唯一的事情就在你的消息,不能被篡改是URI,所有的参数可以被篡改,因为它们不是部分的"校"值的服务器将重新计算。

或者,甚至如果包括每param计算的,你仍然运行的风险的"重播攻击",其中一个恶意中间人或evesdropped可以拦截API呼吁,只是保留重新发送到服务器。

你可以解决这个问题通过增加一个timestamp(总是使用UTC)HMAC计算。

提醒:由于该服务器所需的计算同一HMAC,你必须一起发送的任何价值使用的计算中除了你的秘密的关键(保护身份验证的电话这一consumer_secret我认为)。所以如果你加入的时间戳,确保你发送一个时间戳param随着你的请求。

如果你想让API安全的重复攻击,可以使用一个数值的(这是一个1时使用价值的服务器的产生,提供给客户、客户利用它在HMAC,发回该请求,该服务器的确认和随后标志着这一数值作为"使用"的数据库和从来不会让另一个请求使用它,再)。

注:'现时'是一个非常确切的方式解决"重播的攻击"的问题--时间戳是巨大的,但因为计算机并不总是同步时间戳值,必须允许一个可接受的窗服务器上边怎么"旧"的请求可能(如10分钟,30分钟,1小时....亚马逊使用15分钟)之前,我们接受或拒绝。在这种情况下你API在技术上是脆弱的,在整个窗口的时间。

我认为现时值是巨大的,但应当仅仅需要被使用在Api至关重要的,他们保持其完整性。在我API,我不需要它,但是它将是微不足道的以后添加如果用户要求它...我真的只是需要增加一个"现时"的表在我的数据库,获得一个新的API客户,如:

  • /现时.json

然后当他们送回我的HMAC计算,我需要检查的数据库,以确保它从来没有被使用之前,一旦使用,标记它作为这样的数据库因此,如果请求曾经来再次与同样的现时我会拒绝。

摘要

无论如何,长话短说,我刚刚描述的是 基本上 什么是被称为"2条腿的护身份验证".没有,增加的步骤的流动管理局(Twitter、Facebook,Google,无论)授权的客户,这一步是去除和替代服务器隐含地信托的客户,如果HMAC是他们送匹配。这意味着客户有权secret_key并且是签署它的信息,以服务器的信任。

如果你开始看周围的网络,这似乎是优选方法,确保API方法现在,什么喜欢它。亚马逊几乎完全使用这种方法除了他们使用稍微不同的组合方法,为它们的参数签署之前的整个事情产生HMAC。

如果你有兴趣我 写了这整个旅程 和思想进程,因为我学习它的人。可能会帮助提供一个指导思想游览这一过程。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top