如何创建强大的api密钥

时间:2011-10-20 08:14:10

标签: php api api-key

我想创建一个安全的REST API

例如,如果我看到谷歌API,则会根据域生成API KEY。

从这里我得到了两个问题:

首先,使用单向散列是真/右吗?如果是,如果有人知道散列方法和域,那么他可以生成api密钥并使用它。以及我可以使用的哈希方法/功能?

第二个是,如果客户端如何制作桌面应用程序,如何生成从桌面访问的API KEY,现在是具有域URL的网站。我的意思是,他们可以生成api密钥,因为没有网址。

有什么好方法吗?,如何创建安全api以及如何创建api密钥?

顺便说一句,我正在使用PHP

4 个答案:

答案 0 :(得分:3)

  1. 你可以使用和混合许多哈希方法和额外的盐,这可以基于域+其他逻辑,非常难以猜测或破解(取决于你的哈希算法)将使用和其他东西),除非有人知道它是如何完成的。 您也可以生成UUID并将其用作api密钥(可能我会使用它),例如http://en.wikipedia.org/wiki/Uuid版本4,您可以检查它的实现细节,甚至可以轻松地考虑一些改进。

  2. 不太清楚你的意思。

答案 1 :(得分:2)

如果您计划使用单向哈希,那么您一定要考虑腌制。您可以生成类似10个字符的随机字符串(这将是您的盐),或者将salt附加或添加到域(您最初想要散列的内容),然后通过您选择的单向散列算法传递它。

我猜你正在将API密钥存储在某种数据库中。您将首先执行我上面解释的操作,然后将您的salted和哈希密码与您生成的随机盐一起存储在数据库中。这样,如果有人知道你正在使用的哈希算法,他们仍然需要得到盐。如果你随机制作盐(就像我之前说过的那样),他们很可能无法猜到它:)

如果您计划使用此方法,还有一个额外步骤。检查API密钥是否正确时,您将获取给定的API密钥,遍历您的表并查找您在该API密钥上使用的盐(您可以使用用户的用户名查询该表),将该盐附加或添加到key,然后通过相同的散列算法发送它。如果它与数据库中的匹配,则它是正确的密钥!

希望这有帮助! :)

答案 2 :(得分:1)

好的,所以如果你有一个存储API密钥的数据库表和使用它们的客户端,你可以为所有客户端构建唯一的密钥。您可以轻松地随机化字符,可选地将它们哈希并将其存储为密钥。

例如

$length = 16; // 16 Chars long
$key = "";
for ($i=1;$i<=$length;$i++) {
  // Alphabetical range
  $alph_from = 65;
  $alph_to = 90;

  // Numeric
  $num_from = 48;
  $num_to = 57;

  // Add a random num/alpha character
  $chr = rand(0,1)?(chr(rand($alph_from,$alph_to))):(chr(rand($num_from,$num_to)));
  if (rand(0,1)) $chr = strtolower($chr);
  $key.=$chr;
  }

如果要哈希,可以使用MD5或SHA1,但需要在数据库中进行反向比较,例如

SELECT * FROM api_keys where MD5(key) = INPUT

我希望这会有所帮助

答案 3 :(得分:0)

此函数每次都会返回Random字符串。这将通过调用两次并将值存储到变量中来帮助您生成API密钥和秘密。这是每次生成新密钥时生成的简单方法..

function generateRandomString($length = 30)
{
$characters='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0987654321'.time();
$charactersLength = strlen($characters);
$randomString = '';
  for ($i = $length; $i > 0; $i--)
  {
    $randomString .= $characters[rand(0, $charactersLength - 1)];
  }
  return $randomString;
}


I think this is simple and usefully.