通过AJAX传递加密值会返回不正确的值

时间:2014-02-28 06:41:41

标签: javascript php jquery ajax encryption

我正在使用jQuery AJAX来传递PHP文件的变量。当加密值通过PHP时,它看起来与我在HTML DOM中的内容不同

这就是它在HTML DOM中的外观

<input type="hidden" name="meta" value="�!e�����">

源代码

$profile_id = 1;
    <input type="hidden" name="meta" id="meta" value="<?php echo encrypt($profile_id, ENCRYPTION_KEY); ?>">

我正在使用此PHP函数生成上述加密值

function encrypt($pure_string, $encryption_key){
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $encrypted_string = mcrypt_encrypt(MCRYPT_BLOWFISH, $encryption_key, utf8_encode($pure_string), MCRYPT_MODE_ECB, $iv);
    return $encrypted_string;
}

这是它在JavaScript Alert中的外观(与上面相同)

�!e�����

这是它在PHP加密版本中的外观

�!e�����

这是我解读时的奇怪部分,它的外观不同

N~\�7V��咮���a�2�YE�

解密后它应该具有 1 的值,

这是它的PHP方面

解密值

$to = $_POST["meta"];
$to = decrypt($to, ENCRYPTION_KEY);

这是ENCRYPTION_KEY

if(!defined('ENCRYPTION_KEY')){
    define("ENCRYPTION_KEY", "!@#$%^&*");
}

这是decrption的功能

function decrypt($encrypted_string, $encryption_key){
$iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$decrypted_string = mcrypt_decrypt(MCRYPT_BLOWFISH, $encryption_key, $encrypted_string, MCRYPT_MODE_ECB, $iv);
return $decrypted_string;
}

这是jQuery方面

$("form#form-update-status").on('submit', function(){
    var form, url, wipit, status;
    if($.trim(wipit) == ""){
        form = $(this).serializeArray();
        url = "ajax/update-status.php";
        $.post(url, form, function(data){
            $(".button-update-status").html(data);
        });
    }
    return false;
});

1 个答案:

答案 0 :(得分:1)

这可能与表单发布期间的字符编码有关。解决此问题的最简单方法是使用base64编码的字符串来防止特殊字符。将您的加密/解密更改为:

function encrypt($pure_string, $encryption_key){
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $encrypted_string = mcrypt_encrypt(MCRYPT_BLOWFISH, $encryption_key, utf8_encode($pure_string), MCRYPT_MODE_ECB, $iv);
    return base64_encode($encrypted_string);
}
function decrypt($encrypted_string, $encryption_key){
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $decrypted_string = mcrypt_decrypt(MCRYPT_BLOWFISH, $encryption_key, base64_decode($encrypted_string), MCRYPT_MODE_ECB, $iv);
    return $decrypted_string;
}

此外,请阅读有关在互联网上转义一下的内容(official documentation)。你应该真的逃脱你的所有输出。所以改变这个陈述:

<input type="hidden" name="meta" id="meta" value="<?php echo htmlentities(encrypt($profile_id, ENCRYPTION_KEY), ENT_QUOTES, 'UTF-8'); ?>">