7

我想创建一个安全的 REST API

例如,如果我看到 google API,API KEY 是基于域生成的。

从这里我有两个问题:

首先,使用单向哈希是否正确/正确?如果是的话,如果有人知道哈希方法和域,那么他可以生成 api 密钥并使用它。我可以使用什么哈希方法/函数?

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

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

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

4

4 回答 4

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

  2. 不太清楚你的意思。

于 2011-10-20T11:10:12.857 回答
3

如果您打算使用单向哈希,则绝对应该考虑加盐。您可以生成类似 10 个字符的随机字符串(这将是您的盐),将盐附加或预先添加到域(您最初想要散列的内容),然后通过您选择的单向散列算法传递它。

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

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

希望这可以帮助!:)

于 2013-08-14T03:28:10.120 回答
1

这个函数每次都会返回随机字符串。这将帮助您通过调用两次生成 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.
于 2015-04-21T12:29:02.197 回答
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

我希望这有帮助

于 2011-10-20T08:50:29.413 回答