我的应用程序中有一个开放的API,我想为其提供访问密钥。传入信息将是用户ID,资源ID和要更新的值。我想为每个资源使用一个API密钥。
我希望能够仅使用提供的数据验证传入请求的真实性,而不是检查任何类型的数据库(非常简单,非常快!)
如果我使用md5从资源ID,用户ID和盐生成API密钥,它可能看起来像这样......
authentic_request = md5(user_id + resource_id + salt) == api_key
我的问题实际上就是我应该是多么偏执。像上面这样只有普通的旧md5就足够了吗?另一个选择是使用openssl生成反对pem的键,然后md5结果可以保持简洁,听起来过于偏执甚至在现实中增加一层安全性吗?
感激地收到任何想法甚至是替代品!
由于
答案 0 :(得分:3)
这实际上是hash-based message authentication code的简单实现。
假设你要在(user_id, resource_id)
对的基础上发出这些密钥并保持你所称的salt
秘密的价值,并且你不会期待一个严肃的尝试攻击,这应该工作。但是,最佳实践要求您应该使用比仅仅连接更安全的算法来组合密钥和数据,以及更强大的摘要算法,例如SHA-1;有一个标准的HMAC-SHA1组合算法可以很好地用于此。
第三个值实际上是一个关键,而不是盐;拥有此密钥是允许生成和验证身份验证代码的原因。
答案 1 :(得分:0)
这取决于你想要防范的东西。就其本身而言,这将防止偶然滥用您的API,但它不会阻止重放攻击。如果有人在嗅探您的流量,那么他们将会看到该密钥,并能够通过重复使用来访问该资源。将SSL添加到解决方案可以防止此类攻击。
当你在这里时,你也可以将MD5改为SHA-256。