概观
我在找创建我的应用程序(REST)API。 初始/主要目的将是由移动应用(iPhone,机器人,塞班等)消耗。 我一直在寻找到身份验证和授权基于Web的API不同的机制(通过研究其他实现)。 我有我的头裹住大部分的基本概念,但在一些地区现在还在找工作的指导。 我想做的最后一件事是推倒重来,但我没有找到任何标准的解决方案,符合我的标准(但我的标准我被误导可以随意批评说为好)。 此外,我希望API是相同的所有平台/应用食用它。
OAuth的
我会继续前进,扔掉我反对的OAuth,因为我知道这将有可能提供的第一个解决方案。 对于移动应用(或更具体的非Web应用程序),它只是似乎是错误的离开应用程序(去一个网络浏览器)的认证。 此外,也没有办法(我知道)为浏览器回调返回给应用程序(特别是跨平台)。 我知道有几个是做应用的,但它只是觉得不妥,并给出了应用UX休息。
要求
- 用户输入的用户名/密码输入到应用程序。
- 每个API调用被调用的应用程序识别。
- 开销保持在最低水平,并在auth方面是方便了开发人员。
- 该机制是安全的同时为最终用户(他们的登录凭证不暴露)以及开发者(他们的应用程序凭据不暴露)。
- 如果可能的话,不需要HTTPS(绝不是一个硬性要求)。
我对实现当前的思考
外部开发者将请求的API帐户。 他们将收到apikey和apisecret。 每个请求都需要以最低的三个参数。
- apikey - 在regisration给开发商
- 时间戳 - 兼作唯一标识符为每个消息对于一个给定apikey
- 哈希 - 时间戳+的apisecret的哈希
所述apikey需要识别应用发出请求。 时间戳作用类似于在oauth_nonce和避免/减轻重放攻击。 哈希确保这一要求实际上是从给定的apikey的所有者发行。
对于认证的请求(那些在用户的代表做),我仍然有途径的access_token或用户名和密码哈希组合会之间犹豫不决。 无论哪种方式,在某些时候一个用户名/密码组合是必需的。 所以,当这样做,将被使用的多条信息(apikey,apisecret,时间戳)+密码的哈希值。 我很想在这方面的反馈。 仅供参考,他们将不得不首先散列密码,因为我不在我的系统中存储口令散列没有。
结论
仅供参考,这不是如何建立/结构的API,一般只有如何从单纯内的应用程序处理身份验证和授权的请求。
偶想/奖金问题
原料药只需要apikey作为请求的一部分,你怎么防止比apikey所有者以外的某些人能够看到apikey(因为以明文方式传输),并过度要求他们推过使用限制? 也许我只是在想这一点,但不应该有东西来验证的请求被验证为apikey主人? 在我的情况,那是apisecret的目的,它从未显示/不被散列发送。
说到哈希的,有什么关于MD5 VS HMAC-SHA1? 是否真的重要,当所有的值被散列用足够长的数据(即apisecret)?
我之前已经考虑增加每用户/排盐我的用户密码的哈希。 如果我这样做,应用程序如何能够在不知道使用的盐,以创建一个匹配的哈希?
我想在我的项目做的这个登录部分的方法是:
登录前用户请求login_token
从服务器。 这些被生成并存储在请求的服务器上,并且可能具有有限的寿命。
登录该应用程序计算用户密码的哈希值,然后用散列的口令login_token
获得价值,他们然后返回两个login_token
和联合混杂。
服务器检查login_token
是,它已经产生,从它的有效的列表中删除login_token
秒。 然后,服务器结合了存储在用户的密码散列login_token
并确保其提交的组合令牌相匹配。 如果匹配已认证用户。
这个优点是,你永远不存储用户的密码在服务器上,密码是永远不会阻碍地通过,密码哈希中明确仅通过建立帐户(虽然有可能解决这个办法),它应该是从重放攻击的安全login_token
是从使用DB删除。
这一大堆的问题,在一个,我想不少人没能读取所有的方式结束:)
我的网络服务身份验证的经验是,人们通常overengineer它,问题仅是一样的,你会在网页上遇到的问题。 可以很简单的选择包括了登录步骤,HTTPS,返回一个标记,要求其将包含在将来的请求。 你也可以使用HTTP基本身份验证,而只是通过东西在头中。 为了增加安全性,旋转/到期令牌频繁,检查请求来自同一个IP块到来(虽然移动用户单元格之间移动,这可能会导致混乱),结合API密钥或相似。 另外,做的OAuth的“请求密钥”的步骤(有人在前面的回答表明这已经,这是一个好主意)认证用户之前,和使用,作为一个必要的密钥来生成访问令牌。
我还没有使用过,但我听说了很多关于为设备友好的替代OAuth的另一种方法是XAUTH 。 看看它,如果你使用它,然后我听到你的印象是什么真正感兴趣。
对于散列,SHA-1是一个好一点,但不要让她挂了一下 - 无论这些设备可以很容易地(并迅速在性能的意义上)实施可能是罚款。
希望帮助,祝你好运:)
Twitter的通过支持他们所谓的变型解决在OAuth的外部应用程序问题XAUTH 。 不幸的是已与该名其他方案过多,因此可能会造成混淆理清。
该协议是 OAUTH,除了它跳过请求令牌相和简单地立即发出在接收到用户名和密码的访问令牌对。 (在启动步骤E中在这里 。)这个最初的请求和响应必须受到保护 -它发送用户名和密码的明文和接收回来的访问令牌和秘密令牌。 一旦接入令牌对已经被配置,初始令牌交换是否经由OAUTH模型或模型XAUTH是无关的客户端和服务器的会话的其余部分。 这样做的好处是可以充分利用现有的OAuth的基础设施和具有非常接近的移动/网络/桌面应用程序相同的实现。 主要的缺点是应用程序被授予访问客户端的用户名和密码,但它看起来像你的要求任务这种做法。
在任何情况下,我想用你的直觉和这里其他几个应答者同意:不要试图建立的东西从头开始新的。 安全协议可以很容易开始,但总是很难做的很好,而更令人费解,他们成为不太可能的第三方开发者都能够实现对他们。 假想的协议非常相似,O(x)的验证 - API_KEY / api_secret,现时,SHA1散列 - 但不是能够使用您的开发人员将需要推出自己的许多现有的库之一。
那么,你是后某种服务器端的认证机制将处理移动应用程序的身份验证和授权方面?
假如是这样的话,那么我将如下(但只有“因为我是一个Java开发人员,所以一个C#的家伙会采取不同的方式)来解决:
REST风格的身份验证和授权服务
- 这将只通过HTTPS防止窃听。
- 它会根据组合的RESTEasy , 春季安全和CAS (有关跨多个应用程序的单点登录)。
- 它将与浏览器和基于Web的客户端应用程序工作
- 将会有一个基于Web的客户管理界面,允许用户编辑他们的详细资料,以及管理员(特定应用程序)来更改授权级别
客户端安全库/应用
- 对于每一个支持的平台(如塞班,安卓,iOS设备等)在平台的本地语言(例如,Java,的ObjectiveC,C等)创建一个合适的实现安全库
- 图书馆应利用可用的API为给定的平台管理HTTPS请求形成(如Java使用的URLConnection等)
- 一般的身份验证和授权库的消费者('因为这一切都为)将代码到一个特定的接口,并不会很高兴,如果它发生了改变,所以一定要确保它是非常灵活的。 按照现有的设计选择,如春季安全。
所以,现在从30000英尺认为是完整的,你如何去这样做呢? 嗯,这并不难创建基于与浏览器客户端服务器端的技术列出的身份验证和授权系统。 与HTTPS组合,所述框架将提供基于由所述认证过程中产生,并用于每当用户希望这样做的东西共享令牌(通常作为一个cookie)的安全进程。 此标记由客户提出来,只要任何要求都发生在服务器。
在本地移动应用程序的情况下,看来你是做以下的溶液之后是:
- 客户端应用程序具有定义的访问控制列表(ACL)控制对方法调用运行时访问。 例如,假设一位用户可以从一个方法读取的集合,但他们的ACL只允许访问,在他们的名称,以便在收集一些数据quiety由安全拦截拉有问答的对象。 在Java中,这是简单的,你只需要使用调用代码Spring Security的注释和实施适当的ACL响应过程。 在其他语言中,你对你自己的,并可能需要提供调用到安全库样板安全代码。 如果语言支持AOP(面向方面编程),然后用它来最充分的这种情况。
- 安全库缓存授权的完整列表到它的私有内存为当前应用程序,使其不必保持连接。 根据登录会话的长度,这可能是永远不会重复的一次性操作。
不管你做什么, 不要试图去创造你自己的安全协议 ,或默默无闻使用的安全性。 你永远可以写出更好的算法,这比目前可用的和免费的。 同时,人们也相信公知的算法。 所以,如果你说你的安全库使用SSL,HTTPS,SpringSecurity和AES加密令牌的组合提供本地移动应用程序的授权和认证,然后你会立即在市场中creditibility。
希望这有助于和好运与您的企业。 如果您想了解更多的信息,让我知道 - 我已经写了相当基于Spring的安全,访问控制列表等的一些Web应用程序。
超级迟到了,但我想在一些附加分甩出去考虑任何人对这个问题感兴趣。 我为一家公司做手机API的安全解决方案(工作approov ),所以,这整个地区是我的兴趣肯定相关。
首先,最重要的还是要努力,以确保移动API时需要考虑的启动是多少是值得你 。 对于银行的正确的解决方案是为一个人只是做事情的乐趣合适的解决方案不同。
在提出的解决方案,你提的是一个最低的三个参数将被要求:
- apikey - 在注册给予显影剂
- 时间戳 - 兼作唯一标识符为每个消息对于一个给定apikey
- 哈希 - 时间戳+的apisecret的哈希
这个含义是,对于一些API调用,不需要用户名/密码。 这对您不希望强制登录(在线商店浏览例如)应用。
这是一个稍微不同的问题,以用户认证之一,更像是软件的认证或认证。 没有用户,但您还是要确保有你的API没有恶意的访问。 所以,你用你的API秘密签署交通和识别代码访问API为正版。 这种解决方案的潜在问题是,你就必须放弃应用程序的每一个版本里面的秘密。 如果有人可以提取秘密,他们可以使用自己的API,冒用您的软件,但做任何他们喜欢的。
为了应对这种威胁有一堆东西,你可以根据数据是多么宝贵做。 模糊处理是一种简单的方法来使它更难提取秘密。 有工具,会为你做的,更何况Android的,但你还是必须有一个生成散列的和足够熟练的人可以永远只是调用,它直接的散列函数代码。
以减轻过度使用,不需要登录API的另一种方式是节流流量和潜在的识别和阻止可疑的IP地址。 你想去将努力量在很大程度上取决于你的valuble数据如何。
除此之外,您可以轻松地开始进入我的日常工作的领域。 不管怎么说,这是保护,我认为是非常重要的,想要旗帜竖起的API的另一个方面。