2016-05-06 46 views
1

我有一個奇怪的問題,關於通過url傳遞加密的字符串。我使用來自mcrypt()的base64加密函數進行encryptHTML()和decryptHTML()。PHP Mcrypt_decrypt只解密部分原始字符串

我有這樣一段代碼進行加密:

$link_string = http_build_query(array('index_number'=>30843854, 'extra_attendence_id'=>27982423, 'target_temporary_id'=>378492085, 'date'=>'2016-05-06', 'action'=>'OUT', 'target_id'=>390234), '', '&'); 
$link_string = encryptHTML($link_string); 

然後我通過它通過本網址:

$id = $this->request->param('id'); 
$id = decryptHTML($id); 
parse_str($id, $arr_id2); 
var_dump($arr_id2); 

'localhost/website/controller/action/'.$link_string 

然後我用這一段代碼解密它

如預期,我將得到這些回報:

array(6) { ["index_number"]=> string(8) "30843854" ["extra_attendence_id"]=> string(8) "27982423" ["target_temporary_id"]=> string(9) "378492085" ["date"]=> string(10) "2016-05-06" ["action"]=> string(3) "OUT" ["target_id"]=> string(6) "390234" } 

接下來的情況是,當我還是要加密鏈接,但我需要連接的網頁中的DOM元素一些其他的價值,所以我試圖

'localhost/website/controller/action/encrypt='.$link_string.'&DOMvalue=10000' 

然後我修改瞭解密這片代碼:

$id = $this->request->param('id'); 
parse_str($id, $arr_id2); 

$the_DOMValue = $arr_id2['DOMvalue']; 

$id = decryptHTML($arr_id2['crypted']); 
parse_str($id, $arr_id); 
var_dump($the_DOMValue); echo "<br>"; 
var_dump($arr_id); 

但後來,我得到的回報這些,讓我吃驚:

​​

我原來的琴絃被剪短了!請注意,DOM值很好。 然後,我檢查這兩個解密之前右,如果給定的加密字符串是不同的:

上decryptHTML的第一種情況:

$id = $this->request->param('id'); 
var_dump($id); 
$id = decryptHTML($id); 

回報:

string(224) "zCQnh-rNP2R7h4UHyV5Dm5zp494DIIku5LWN51yYGMXBaHf0gJgEDw8UCuHRZxr-CkjkevHQ70kOPnSBQ9CJP6lZrFone-nDMDJhYlL8330wz+zud8-3tSWvdOLB7je5D-22aX4OrE3zlBYZZZtI-rMT73H0JGIRzZge2GzcZGLwS7Rj+GL5Ym-ET6JEHDShST4etgcQaEYXml-+BZ2+0BQKvubZEBOB" 
上的第二殼體

decryptHTML:

$id = $this->request->param('id'); 
parse_str($id, $arr_id2); 

$the_DOMValue = $arr_id2['DOMvalue'];   
var_dump($arr_id2['crypted']); 
$id = decryptHTML($arr_id2['crypted']); 

回報:

string(224) "zCQnh-rNP2R7h4UHyV5Dm5zp494DIIku5LWN51yYGMXBaHf0gJgEDw8UCuHRZxr-CkjkevHQ70kOPnSBQ9CJP6lZrFone-nDMDJhYlL8330wz zud8-3tSWvdOLB7je5D-22aX4OrE3zlBYZZZtI-rMT73H0JGIRzZge2GzcZGLwS7Rj GL5Ym-ET6JEHDShST4etgcQaEYXml- BZ2 0BQKvubZEBOB" 

它看起來和我完全一樣,但奇怪的是它被解密的方式不同。我當然使用相同的功能來解密這兩種情況...

任何人都可以對此有所瞭解嗎?

+0

_imo_,我建議你在URL中使用字符串時不要使用base64_encode/decode。爲什麼?它再次被編碼。它是HTML中的一個地方,不應使用_base64_encode/decode_。請看:[urlencode - URL-encodes string](http://php.net/manual/en/function.urlencode.php)。或者,轉換爲十六進制字符串('bin2hex')和('hex2bin)'。在HTML中的任何地方使用更長,但絕對安全 –

回答

1

經過加密的字符串URL通過

Passing an encrypted string through a URL是一個壞主意。句號。

我正在使用來自mcrypt()的base64加密函數encryptHTML()和decryptHTML()。

沒有看到這些函數做什麼,這是沒有用的信息,但是mcrypt should be avoided。使用Libsodium(如果可以的話;否則使用OpenSSL)。

我原來的字符串被縮短了!

它可能把+看作是一個空間。使用urlencode()將解決一個問題,但它不會解決在缺少消息認證碼(MAC)時使用mcrypt引入到您的應用程序中的vulnerability to chosen-ciphertext attacks