如何在不同的HTTP请求中加密和解密

时间:2017-01-27 19:48:57

标签: php mcrypt

我想创建一个$ state字符串,并将其通过URL发送到另一个应用程序。另一个应用程序将执行此操作(OAuth验证),然后重定向回到orignal应用程序,并在URL中再次返回状态(例如state = 789sdgydfg9d ...)

下面我只是用mcrypt函数测试加密/解密:

$secret_key = 'e6aeee1c80c231bf724b31d3c4cc77dd';
$string = 'This is a string to encode';
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);

// this will be sent with the first redirect...
$state = rawurlencode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $secret_key, $string, MCRYPT_MODE_CBC, $iv));

// .. this will be received when the client is redirected back here 
// in another HTTP request
$decrypted_string = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $secret_key, rawurldecode($state), MCRYPT_MODE_CBC, $iv);

var_dump($decrypted_string); // Outputs: "This is a string to encode"

如果我做这个测试,它可以工作,因为它是相同的请求,我想$ iv对于mcrypt_encrypt和mcrypt_decrypt是相同的。

但是,如果我打算在两个HTTP请求之间进行拆分:

$secret_key = 'e6aeee1c80c231bf724b31d3c4cc77dd';
$string = 'This is a string to encode';
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);

// this will be sent with the first redirect...
$state = rawurlencode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $secret_key, $string, MCRYPT_MODE_CBC, $iv));

然后重定向客户端,并在URL中传回状态:

$secret_key = 'e6aeee1c80c231bf724b31d3c4cc77dd';
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);

$decrypted_string = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $secret_key, rawurldecode($state), MCRYPT_MODE_CBC, $iv);

// Outputs: "�|% <�-��+^�%6��7�rY��^�"

一切都搞砸了。我猜测因为另外用MCRYPT_RAND选项创建了$ iv,它会有所不同,因此也会有不同的解密方式。但是我找不到一个如何为这个案例写出来的例子。

我应该如何加密/解密,这样我才能在重定向后成功解密?

0 个答案:

没有答案