为我的 API 实现 API 密钥

Posted

技术标签:

【中文标题】为我的 API 实现 API 密钥【英文标题】:Implementing API keys for my API 【发布时间】:2012-12-18 10:07:52 【问题描述】:

我已经创建了一个 api,我想对谁使用它、使用频率等进行一些控制。我想要一个 API 密钥策略,以便用户必须提供密钥才能使用 API。但是我不知道如何实现它。用户使用用户名和密码注册。我想到的是在用户登录时分配一个 UUID 并将其存储在数据库的表中。然后每个请求都包含这个 uuid,并在服务器上对每个请求进行检查。

然而这似乎不对。有人可以解释创建 api 密钥的步骤吗,比如 dropbox、twitter、facebook 等?我想尝试自己实现。

【问题讨论】:

您想要实施 OAuth 吗?或者你真的只是想生成一个随机密钥?我假设您想要公共/私人配对? 如果您找到了解决方案,请与我们分享? 【参考方案1】:

有人能解释一下创建 api 的步骤吗 key like, dropbox, twitter, facebook 等呢? 我想尝试自己实现。

生成 API 密钥

    选择一些您想使用的加密/解密方法 选择您将在加密之前添加到数据中的盐 决定你想要加密字符串中的哪些数据:时间戳、Uid、角色等。时间戳是其中最有用的部分,因为使用时间戳,您可以限制来自某个时间之前的密钥的请求,因此需要生成新的密钥。 将其捆绑在解密后可以解析的内容中。有些人使用 json 对象,有些人使用字符分隔的字符串

注意:如果您不希望它成为可解密的密钥,例如,它经过哈希处理,因此难以破解,那么您可以简单地遵循以下策略:制定一组步骤来形成您的未哈希数据string: sha1("some-secret"."some-other-bit-of-info"."etc"."etc") 然后 API 使用者有责任生成自己的密钥。因此,他们只有在拥有构建它所需的必要部件/信息时才能访问。

使用 API

以 Stripe 的 API 为例:

    发出授权请求:返回 API 密钥。 "curl 使用 -u 标志传递基本身份验证凭据(在您的 API 密钥后添加一个冒号会阻止它询问您的密码)。" --Stripe Docs

    将该密钥连同所有进一步的请求一起发送。

【讨论】:

常用的加密/解密方法有哪些?我猜你不能为此使用单向哈希函数? 日期、角色等是否需要在密钥中编码?我不能创建一个密钥并添加一个盐,然后对其进行哈希处理并将其提供给用户。对于每个请求,我都使用密钥来查找我需要的任何内容? 实际上并不总是需要。我个人觉得很有必要。但是,如果您只在其中存储静态数据(永远不会更改的数据),那么您可以使用散列而不是加密,这是单向且几乎无法破解的。见编辑

以上是关于为我的 API 实现 API 密钥的主要内容,如果未能解决你的问题,请参考以下文章

使用 API 密钥策略的 Lumen API 身份验证

限制Google API的Android密钥使用

我应该采取哪些措施来保护我的Google Maps API密钥?

Laravel:AppServiceProvider 注册 API 密钥?

将私有 api 密钥存储在颤振中

Android:自动选择调试/发布Maps v2 api密钥?