как создать сильный ключ API - PullRequest
7 голосов
/ 20 октября 2011

Я хочу создать безопасный API REST

Если я вижу API Google, например, ключ API генерируется на основе домена.

из этого я получил два вопроса:

Во-первых, это правда / правильно с использованием одностороннего хеширования? Если да, то как, если кто-то знает метод хеширования и домен, чтобы он мог генерировать API-ключ и использовать его. и какой хеш-метод / функцию я могу использовать?

Во-вторых, как, если клиент создает настольное приложение, как он может генерировать API-ключ, доступ к которому осуществляется с рабочего стола, теперь веб-сайт с URL-адресом домена. Я имею в виду, они могут генерировать API-ключ, потому что не имеют URL.

Есть ли какой-нибудь хороший способ? Как создать защищенный API и как создать ключ API?

Кстати, я использую PHP

Ответы [ 4 ]

3 голосов
/ 20 октября 2011
  1. вы можете использовать и смешивать множество методов хеширования с дополнительной солью, которая может быть основана на домене + другая логика, которая будет очень трудной для угадывания или взлома (зависит от того, какие алгоритмы хеширования вы будете использовать использовать и другие вещи), если кто не знает, как это делается. вы также можете сгенерировать UUID и использовать его в качестве ключа API (возможно, я бы это использовал), например, http://en.wikipedia.org/wiki/Uuid версии 4. Вы можете проверить детали реализации этого или даже легко подумать о некоторых улучшениях.

  2. не совсем уверен, что вы там имеете в виду.

2 голосов
/ 14 августа 2013

Если вы планируете использовать однонаправленный хэш, вам обязательно стоит обратить внимание на соление.Вы можете сгенерировать что-то вроде случайной строки из 10 символов (это будет ваша соль), либо добавить или добавить соль к домену (то, что вы изначально хотели хэшировать), а затем пропустить ее через односторонний алгоритм хеширования по вашему выбору.

Я предполагаю, что вы храните свои ключи API в какой-то базе данных.Сначала вы сделаете то, что я объяснил выше, а затем сохраните этот соленый и хешированный пароль в вашей базе данных вместе со случайной солью, которую вы создали.Таким образом, если кто-то знает алгоритм хеширования, который вы используете, он все равно должен получить в свои руки соль.Если вы сделаете свою соль случайной (как я говорил ранее), они, скорее всего, не смогут ее угадать:)

Есть еще один шаг, если вы планируете использовать этот подход.При проверке правильности ключа API вы должны взять данный ключ API, просмотреть таблицу и найти соль, которую вы использовали для этого ключа API (вы можете запросить таблицу, используя имя пользователя user), добавить или добавить эту соль кключ, а затем отправить его через тот же алгоритм хеширования.Если он совпадает с указанным в вашей базе данных, это правильный ключ!

Надеюсь, это поможет!:)

1 голос
/ 20 октября 2011

Хорошо, поэтому, если у вас есть таблица базы данных, в которой хранятся ключи 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

Надеюсь, это поможет

0 голосов
/ 21 апреля 2015

Эта функция будет возвращать случайную строку каждый раз.Это поможет вам сгенерировать API Key and 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...