gpt4 book ai didi

php - 在php中通过mcrypt生成一次性 token ?

转载 作者:行者123 更新时间:2023-12-01 22:50:29 24 4
gpt4 key购买 nike

我将向我的合作伙伴网站提供 API key ,他们将使用我提供给他们的代码来生成“ token ”。

这些 token 将自动显示在合作伙伴网站的用户单击并访问我的网站的表单上。当他们访问我的网站时,我需要验证它们确实来自合作伙伴网站。

我如何验证这一点? apikey 将是 secret 的,但表单中呈现的内容不会是 secret 的,因此聪明的用户不可能对我的算法进行逆向工程。


编辑

选项1:我让客户端页面通过 md5($apikey.$time) 和 $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 小时内?


编辑TB

这听起来有多安全? (代码借用 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";

最佳答案

看起来您正在实现类似于开放身份验证的功能 - twitter/facebook 等用于启用合作伙伴网站的过程。

我建议您查看 oAuth - http://oauth.net/ - 有大量的库和 php 示例。

如果您确实想做一些简单的事情,那么假设您已经获得了已分发的 API key 的记录,我会编写客户端脚本,以便它使用另一位 key 生成 key 的 md5 哈希值表单上的信息 - 例如用户名(我们将散列字符串称为请求 key ,将用户名称为用户名),并且我将包含合作伙伴的标识符(我们将其称为partner_id)。

因此,当表单提交时,它具有请求 key 、用户名和partner_id。

当您的服务器收到请求时,您可以使用partner_id查找合作伙伴的 key ,然后使用提供的用户名对您获得的 key 进行md5,并查看它是否与随表单发送的md5 key 匹配.

@弗兰克...

[根据您的评论添加此内容]

为了使通过线路发送的 key 一次性,您可以让客户端网页请求临时 session key - 您的服务器生成一个(使用日期 + 时间 + 密码的组合),保存它作为合作伙伴表中的临时 key (与其永久 key 一起)并将其发送回客户端。然后,客户端应用程序使用永久 key 对其进行 MD5 并与表单一起提交。然后,您查找永久 key 和临时 key 并将它们散列在一起,并将结果与​​您发送的散列进行比较。

这样看起来还可以吗?

关于php - 在php中通过mcrypt生成一次性 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5727607/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com