【问题标题】:how to create strong api key如何创建强大的 api 密钥
【发布时间】:2011-12-11 14:06:32
【问题描述】:

我想创建一个安全的 REST API

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

我有两个问题:

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

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

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

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

【问题讨论】:

标签: php api api-key


【解决方案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

希望对你有帮助

【讨论】:

  • 如果您没有 url,您还可以添加诸如创建时间或 api 用户的用户名/用户 ID 之类的内容。
【解决方案2】:
    1234563将使用和其他东西),除非有人知道它是如何完成的。 您还可以生成 UUID 并将其用作 api 密钥(可能我会使用它),例如 http://en.wikipedia.org/wiki/Uuid 版本 4,您可以检查它的实现细节,甚至可以轻松地想到一些改进。李>
  1. 不太清楚你的意思。

【讨论】:

  • 对于数字 2,如果 API_KEY 是基于域 url 生成的。桌面应用程序是否可以使用 API 密钥?
  • 您不需要使用域作为因素来生成 API 密钥。正如我的回答中提到的,您可以使用随机字符生成任何密钥,如果您想要进一步的逻辑,请使用一种在网站上注册 api 密钥的形式,允许它使用客户端 ID 等对生成的密钥进行哈希处理。这一切都非常灵活并且完全取决于您想要实现的目标
【解决方案3】:

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

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

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

希望这会有所帮助! :)

【讨论】:

    【解决方案4】:

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

    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.
    

    【讨论】:

      猜你喜欢
      • 2020-04-15
      • 2012-08-03
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      • 2018-09-01
      • 2011-04-29
      相关资源
      最近更新 更多