【问题标题】:PHP Mcrypt_decrypt decrypt only parts of the original stringPHP Mcrypt_decrypt 只解密原始字符串的一部分
【发布时间】:2016-09-01 11:35:21
【问题描述】:

我有一个关于通过 url 传递加密字符串的奇怪问题。我正在使用来自 mcrypt() 的 base64 加密来进行 encryptHTML() 和 decryptHTML()。

我有这段代码要加密:

$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);

然后我通过这个网址传递它:

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

然后我用这段代码解密了它:

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

正如预期的那样,我会得到这些回报:

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);

但是,令我惊讶的是,我得到了这些回报:

string(5) "10000" 
array(3) { ["index_number"]=> string(13) "58_2016-04-26" ["extra_attendence_id"]=> string(1) "0" ["target_t"]=> string(0) "" }

我原来的字符串被剪短了!请注意,DOMvalue 很好。 然后,我在两次解密之前检查了它,如果给定的加密字符串不同:

第一种情况下的解密HTML:

$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"

在我看来完全一样,但奇怪的是它的解密方式不同。我当然使用相同的函数来解密这两种情况......

谁能帮我解释一下?

【问题讨论】:

  • imo,我建议您在使用 URL 中的字符串时不要使用 base64_encode / decode。为什么?它再次被编码。这是 HTML 中不应使用 base64_encode / decode 的一个地方。请看:urlencode — URL-encodes string。或者,转换为十六进制字符串 (bin2hex) 和 (hex2bin)。更长但在 HTML 中的任何位置都可以安全使用..

标签: php encryption mcrypt


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 2018-03-09
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    相关资源
    最近更新 更多