Генерация одноразовых токенов через mcrypt в php? - PullRequest
2 голосов
/ 20 апреля 2011

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

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

как мне это проверить?apikey будет секретным, но то, что представлено в форме, НЕ будет, поэтому у умных пользователей не должно быть возможности перепроектировать мой алгоритм.


EDITA

Option1:Я получаю страницу клиента для отправки через md5 ($ apikey. $ Time) и $ time (в виде открытого текста).Когда я его получаю, я использую время и свою копию apikey для генерации md5 ($ apikey. $ Time).если он совпадает и находится в течение 1 часа (или чего-то еще), я разрешаю выполнение запроса.

Опция 2: у меня уже есть $ userid, также поступает $ requestcommandoption.Я могу сделать следующее:

$input = $userid.'-'.$requestcommandoption.'-'.$time;

$encrypted_data = mcrypt_ecb (MCRYPT_3DES, $apikey, $input, MCRYPT_ENCRYPT);

когда я получу его на своем конце, я могу сделать:

$decrypted_data = mcrypt_ecb (MCRYPT_3DES, $apikey, $encrypted_data, MCRYPT_DECRYPT);

и затем проверить 2 входа, если они одинаковы, и3-й, если в течение 1 часа?


EDITB

Насколько безопасен этот звук?(код заимствован из http://onlamp.com/pub/a/php/2001/07/26/encrypt.html?page=3)

// on client
$apikey="test123";
$userid = '577';
$requestcommandoption = 'delete-all';
$time = mktime();
echo "time = $time<p>";

$input = $userid.'-'.$requestcommandoption.'-'.$time;

// Encryption Algorithm
$cipher_alg = MCRYPT_RIJNDAEL_128;

// Create the initialization vector for added security.
$iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher_alg, MCRYPT_MODE_ECB), MCRYPT_RAND);

// Encrypt $string
$encrypted_string = mcrypt_encrypt($cipher_alg, $apikey, $input, MCRYPT_MODE_CBC, $iv);

$transmitted = bin2hex($encrypted_string);

// sent from client    to server
print "Encrypted string: ".$transmitted."<p>";


// received on server    
$encrypted_string = pack("H*" , $transmitted);
$decrypted_string = mcrypt_decrypt($cipher_alg, $apikey, $encrypted_string, MCRYPT_MODE_CBC, $iv);

print "Decrypted string: $decrypted_string";

Ответы [ 3 ]

2 голосов
/ 20 апреля 2011

Вы должны проверить OAuth и OAuth 2 стандартов. Они широко используются для авторизации и многих API (Facebook, Twitter и т. Д.)

2 голосов
/ 20 апреля 2011

Похоже, что вы реализуете что-то похожее на открытую аутентификацию - процесс Twitter / Facebook и т. Д. Используется для включения партнерских сайтов.

Я бы рекомендовал вам взглянуть на oAuth - http://oauth.net/ - есть множество библиотек и примеров php.

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

Таким образом, когда форма отправляется, у нее есть requestkey, username и partner_id.

Когда ваш сервер получает запрос, вы можете найти секретный ключ дляпартнер, используя partner_id, затем md5 секретный ключ, который вы получили, с предоставленным именем пользователя и посмотрите, соответствует ли он ключу md5, отправленному сform.

@ frank ...

[Добавление этого в результате вашего комментария]

Чтобы сделать ключ, отправляемый по проводам, одноразовым, выможет заставить клиентскую веб-страницу запрашивать временный сеансовый ключ - ваш сервер генерирует его (используя комбинацию даты + время + секретное слово), сохраняет его в качестве временного ключа в таблице партнеров (вместе с их постоянным ключом) и отправляет еговернуться к клиенту.Затем клиентское приложение использует MD5 с постоянным ключом и отправляет его с помощью формы.Затем вы ищите постоянные и временные ключи и хешируете их вместе и сравниваете результат с отправленным хешем.

это выглядит нормально?

2 голосов
/ 20 апреля 2011

А как насчет GUID?Конечно, вам придется отслеживать выданные GUID.

http://php.net/manual/en/function.com-create-guid.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...