2

我的应用程序中有一个开放 API,我想为其提供访问密钥。传入的信息将是用户 ID、资源 ID 和要更新的值。我想要每个资源一个 API 密钥。

最好我希望能够仅使用提供的数据验证传入请求的真实性,而不是检查任何类型的数据库(非常简单,非常快!)

如果我使用 md5 从资源 ID、用户 ID 和盐生成 API 密钥,它可能看起来像这样......

authentic_request = md5(user_id + resource_id + salt) == api_key

我的问题实际上是关于我应该有多偏执的问题。像上面那样只用普通的旧 md5 就足够了吗?另一种选择是使用 openssl 生成针对 pem 的密钥,然后使用 md5 生成结果以保持简洁,这听起来是否过于偏执,甚至在现实中增加了一层安全性?

任何想法甚至替代品都非常感谢!

谢谢

4

2 回答 2

4

这实际上是基于散列的消息身份验证代码的简单实现。

假设您要根据该(user_id, resource_id)对给出这些密钥并保持您所称的salt秘密值,并且您不期望进行严重的攻击尝试,这应该可行。但是,最佳实践要求您应该使用比单纯连接更安全的算法来组合密钥和数据,以及更强大的摘要算法,例如 SHA-1;有一个标准的 HMAC-SHA1 组合算法可以很好地解决这个问题。

第三个值实际上是键,而不是盐;拥有这个密钥允许生成和验证验证码。

于 2010-10-28T00:45:07.960 回答
0

这取决于您要保护的内容。就其本身而言,这将防止随意滥用您的 API,但不会防止重放攻击。如果有人在嗅探您的流量,那么他们将看到密钥并能够通过重用它来访问资源。将 SSL 添加到解决方案中可以防止这种类型的攻击。

当您使用它时,您不妨将 MD5 更改为 SHA-256。

于 2010-10-28T00:48:05.133 回答