【问题标题】:javascript alternative to mcrypt_encryptjavascript 替代 mcrypt_encrypt
【发布时间】:2012-03-20 21:49:43
【问题描述】:

我想知道是否有一个 javascript 库可以在 php 中提供 mcrypt_encrypt 的功能。

我正在编写一个函数来使用 javascript 访问我的 api。我总是加密和编码我的参数。这是我想要一个js版本的方法。

public function sendRequest($request_params)
{
    //encrypt the request parameters
    $enc_request = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->_app_key, json_encode($request_params), MCRYPT_MODE_ECB));

    //create the params array, which will
    //be the POST parameters
    $params = array();
    $params['enc_request'] = $enc_request;
    $params['app_id'] = $this->_app_id;

    //initialize and setup the curl handler
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $this->_api_url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    //execute the request
    $result = curl_exec($ch);

    //json_decode the result
    $result = @json_decode($result);
    //if everything went great, return the data
    return $result;
}

这是我提出的上述请求的 jquery 版本,但它总是返回无效请求。表示 API 无法解密请求

        var queryAPI = function (request_object,callback)
        {
            var app_key = 'sdffkjhdsjfhsdjkfhsdkj';
            var app_secret = 'hfszdhfkjzxjkcxzkjb';
            var app_url = 'http://www.veepiz.com/api/jsonp.php';
            var enc_request = $.toJSON(request_object);
            var ciphertext =encode64(Crypto.AES.encrypt(enc_request, app_secret, { mode: new Crypto.mode.ECB }));
            $.post(app_url,{'app_id':app_key,'enc_request':ciphertext},
            function (data)
            {
                console.log(data);
            },'jsonp');

        }

这是我运行上述函数的方式

                        var request={'controller':'user','action':'login','emailaddress':email,'password':pass};
                        queryAPI(request,function (d){console.log(d);});

在服务器端api,这里是php如何解密请求

$params = json_decode(trim(mcrypt_decrypt( MCRYPT_RIJNDAEL_256, $app_secret, base64_decode( urldecode( $enc_request )), MCRYPT_MODE_ECB )));
//check if the request is valid by checking if it's an array and looking for the controller and action
if( $params == false || isset($params->controller) == false || isset($params->action) == false ) {
    $result['success'] = 0;
    $result['errormsg'] = "Request is not valid! ";
    //echo the result of the API call
    header('Cache-Control: no-cache, must-revalidate');
    header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
    header('Content-type: application/javascript');        
    $result=json_encode($result);
    # JSON if no callback
    if( ! isset($_GET['callback']))
        exit( $result );

    # JSONP if valid callback
    if(is_valid_callback($_GET['callback']))
        exit( "{$_GET['callback']}($result)" );

    # Otherwise, bad request
    header('Status: 400 Bad Request', true, 400);                     
}

【问题讨论】:

    标签: php javascript encryption


    【解决方案1】:

    您可以尝试使用crypto-js,或者ezcryptocryptojs 的后代之一。我认为AES 和 Rijndael 是一样的。

    【讨论】:

    • 刚刚尝试了 crpto.js,我认为它让我失望了,我也对问题进行了编辑,所以请指教
    • 尝试在客户端加密和base64编码之后,url解码,base64解码和解密之前和之后记录输出,这样我们就有机会看到哪里出错了。
    • 在 js 端没问题...console.log(encode64(Crypto.AES.encrypt("ferguson", "jordah", { mode: new Crypto.mode.ECB })));返回 "RlpVN1lMc3dvbTZKSTIvS2VXekk2dyUzRCUzRA==" 不带引号。在 php 上我运行 mcrypt_decrypt(MCRYPT_RIJNDAEL_256, "jordah", base64_decode("RlpVN1lMc3dvbTZKSTIvS2VXekk2dyUzRCUzRA=="), MCRYPT_MODE_ECB);它返回 null
    • 请将日志输出添加到您的问题中。根据this comment PHP 的 Rijndael 192 和 256 版本不兼容 AES。
    • 好的,我已经尝试过这个 javascript 方面。最好我给一个简单的测试。 console.log(encode64(Crypto.AES.encrypt("ferguson", "jordah", { mode: new Crypto.mode.ECB }))); //输出RlpVN1lMc3dvbTZKSTIvS2VXekk2dyUzRCUzRA==。当我尝试使用 php mcrypt 解密时,$va=mcrypt_decrypt(MCRYPT_RIJNDAEL_128, "jordah", base64_decode("RlpVN1lMc3dvbTZKTIvS2VXekk2dyUzRCUzRA=="), MCRYPT_MODE_ECB); ---> 我得到 null
    【解决方案2】:

    好的,我用 AES 解决了这个问题,我发现总是(服务器端)urldecode($enc_request),因为 base64 '=' 在发布到 url 时会改变。我使用的教程在这里JavaScript and PHP Encryption – The Secret Handshake

    显然我的问题是由一个有问题的 encode64() javascript 函数引发的,该函数返回了一个无效的 base64 字符串

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-20
      • 1970-01-01
      • 2018-09-10
      • 2016-11-16
      • 2016-09-12
      • 2012-04-08
      • 2015-01-14
      • 1970-01-01
      相关资源
      最近更新 更多