我在我的应用程序中有一个开放的API,我想为它提供访问密钥。传入的信息将是用户id、资源id和要更新的值。我希望每个资源都有一个API密钥。
我最好能够只使用提供的数据来验证传入请求的真实性,而不是检查任何类型的数据库(非常简单,非常快速!)
如果我使用md5从资源ID、用户id和盐生成API,它可能类似于……
authentic_request = md5(user_id + resource_id + salt) == api_key我的问题实际上是关于我应该有多偏执。只用普通的老式md5就能满足上面的要求吗?另一种选择是使用openssl针对pem生成密钥,然后md5结果以使其简洁,这听起来是不是过于偏执,甚至在现实中增加了一层安全性?
任何想法,甚至是备选方案,非常感谢!
谢谢
发布于 2010-10-28 08:45:08
这实际上是hash-based message authentication code的简单实现。
假设您打算在(user_id, resource_id)对的基础上分发这些密钥,并将您所说的salt的值保密,并且您不希望有严重的攻击尝试,那么这应该是可行的。但是,最佳实践指出,您应该使用比单纯的连接更安全的算法来组合密钥和数据,并使用更强大的摘要算法,例如SHA-1;有一种标准的HMAC-SHA1组合算法可以很好地实现这一点。
第三个值实际上是一个密钥,而不是一个盐;拥有这个密钥可以生成和验证验证码。
发布于 2010-10-28 08:48:05
这取决于你想要保护什么。就其本身而言,这将防止您的API被随意滥用,但它不能防止重放攻击。如果有人正在嗅探您的流量,那么他们将看到密钥,并能够通过重用它来访问资源。将SSL添加到解决方案中可以防止此类攻击。
在此期间,您也可以将MD5更改为SHA-256。
https://stackoverflow.com/questions/4038811
复制相似问题