2010-10-28 66 views
1

我在我的应用程序中有一个开放的API,我想提供访问密钥。传入的信息将是用户ID,资源ID和要更新的值。我希望每个资源都有一个API密钥。创建加密API密钥的最佳方法

优选我想能够验证仅使用所提供的数据,而不是检查对任何形式的数据库的传入请求的真实性(非常简单,非常快!)

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

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

我的问题真的是一个对我应该怎么偏执是。上述只是普通的老式MD5就足够了吗?另一种选择是使用openssl为pem生成密钥,然后可能使md5的结果保持简洁,这听起来是否过分偏执,甚至在现实中增加了一层安全性?

任何想法,甚至alternataaives感激地收到!

感谢

回答

3

这实际上是一个简单的实施hash-based message authentication code的。

假设你打算在(user_id, resource_id)对的基础上发放这些密钥,并保留你称为salt的秘密的值,并且你不希望认真尝试攻击,这应该起作用。但是,最佳实践表明,应该使用比单纯串联来更安全的算法来组合密钥和数据,以及更强的摘要算法,如SHA-1;有一个标准的HMAC-SHA1组合算法,它可以很好地工作。

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

+0

谢谢,这正是我一直在寻找的。知道必须有一个已知的技术,这只是很难表达搜索条件! – matth 2010-10-28 11:05:33

0

这取决于你想要防范什么。在它自己的这将防止偶然滥用您的API,但它不会阻止重播攻击。如果有人正在嗅探您的流量,那么他们会看到密钥,并能够通过重新使用它来访问资源。将SSL添加到解决方案可防止此类攻击。

当你在它上面时,你可能会改变MD5到SHA-256。

+0

谢谢,我明白,关键不提供这个级别的安全性,因为它可以被拦截和滥用。只需寻找一个安全的身份验证机制,就会考虑使用SSL进行通信。 – matth 2010-10-28 11:07:23