ajax_jsonp_php加密_跨域例子

服务端 php

<?php
    header("Content-Type:text/html;charset=UTF-8");
       // $string: 明文 或 密文
       // $operation:DECODE表示解密,其它表示加密
       // $key: 密匙
       // $expiry:密文有效期
function authcode($string, $operation = ‘DECODE‘, $key = ‘‘, $expiry = 0) {
       // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙
    $ckey_length = 4;
      // 密匙
    $key = md5($key ? $key : $GLOBALS[‘discuz_auth_key‘]);
      // 密匙a会参与加解密
    $keya = md5(substr($key, 0, 16));
      // 密匙b会用来做数据完整性验证
    $keyb = md5(substr($key, 16, 16));
      // 密匙c用于变化生成的密文
    $keyc = $ckey_length ? ($operation == ‘DECODE‘ ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : ‘‘;
      // 参与运算的密匙
    $cryptkey = $keya.md5($keya.$keyc);
    $key_length = strlen($cryptkey);
      //明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),解密时会通过这个密匙验证数据完整性
      // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确
    $string = $operation == ‘DECODE‘ ? base64_decode(substr($string, $ckey_length)) : sprintf(‘%010d‘, $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
    $string_length = strlen($string);
    $result = ‘‘;
    $box = range(0, 255);
    $rndkey = array();
        // 产生密匙簿
    for($i = 0; $i <= 255; $i++) {
        $rndkey[$i] = ord($cryptkey[$i % $key_length]);
    }
       // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度
    for($j = $i = 0; $i < 256; $i++) {
        $j = ($j + $box[$i] + $rndkey[$i]) % 256;
        $tmp = $box[$i];
        $box[$i] = $box[$j];
        $box[$j] = $tmp;
    }
       // 核心加解密部分
    for($a = $j = $i = 0; $i < $string_length; $i++) {
        $a = ($a + 1) % 256;
        $j = ($j + $box[$a]) % 256;
        $tmp = $box[$a];
        $box[$a] = $box[$j];
        $box[$j] = $tmp;
           // 从密匙簿得出密匙进行异或,再转成字符
        $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
    }
    if($operation == ‘DECODE‘) {
          if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)){
            return substr($result, 26);
        } else {
            return ‘‘;
        }
        echo "44444444";
    } else {
   //把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因 //因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码
        return $keyc.str_replace(‘=‘, ‘‘, base64_encode($result));
        echo "222222";
    }
}
$callback = isset($_REQUEST[‘callback‘]) ? trim($_REQUEST[‘callback‘]) : ‘‘;
if (isset($_REQUEST[‘mystr‘])){
   $str = $_REQUEST[‘mystr‘];
   if (isset($_REQUEST[‘mykey‘])){
      $key = $_REQUEST[‘mykey‘];
      if (isset($_REQUEST[‘act‘])){
         $act = $_REQUEST[‘act‘];
         //echo ‘authcode.php?act=ENCODE&mystr=TTTT&mykey=222<br>‘;
         //echo authcode($str,$act,$key,100);
         $codeaa=authcode($str,$act,$key,100);
         echo $callback."({ret:1,msg:‘ok‘,key:‘".$key."‘,code:‘".$codeaa."‘})";
        }else{
            echo $callback."({ret:0,msg:‘错误‘})";
        }
    }else{
            echo $callback."({ret:0,msg:‘错误‘})";
        }
}else{
            echo $callback."({ret:0,msg:‘错误‘})";
        }

客户端 html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Ajax Jsonp</title>
    <script type="text/javascript" src="http://lib.sinaapp.com/js/jquery/1.7.2/jquery.min.js"></script>
    </head>
    <script type="text/javascript">
    $(function(){
        $.ajax({
            type : "GET",
            async:false,
            url : "http://115.236.183.115:81/php_encode/",
            dataType : "jsonp",
            data:{
                  act:"ENCODE",
                  mykey:"222",
                  mystr:"ggg"
                  },
            jsonp: "callback",
            success : function(data){
                $("#showcontent").text(data.code)
            },
            error:function(){
                alert(‘失败!‘);
            }
        });
    });
    </script>
    <body>
    <div id="showcontent">加密后字符为:</div>
    <!--http://115.236.183.115:81/php_encode/?act=ENCODE&mykey=222&mystr=ggg&callback=kkkk-->
    </body>
    </html>  

不跨域访问 html

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>演示:PHP加密解密字符串</title>
<style>
.demo{width:520px; margin:40px auto 0 auto; min-height:250px;}
.input{padding:3px; line-height:22px; border:1px solid #ccc}
.btn{overflow: hidden;display:inline-block;*display:inline;padding:4px 20px 4px;font-size:14px;line-height:18px;*line-height:20px;color:#fff;text-align:center;vertical-align:middle;cursor:pointer;background-color:#5bb75b;border:1px solid #cccccc;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px; margin-left:2px}
#result{margin-top:20px; line-height:26px; color:#f30; word-break:break-all}
</style>
<script type="text/javascript" src="http://lib.sinaapp.com/js/jquery/1.7.2/jquery.min.js"></script>
<script>
$(function () {
    $("#encode").click(function(){
        post(‘ENCODE‘);//加密
    });
    $("#decode").click(function(){
        post(‘DECODE‘);//解密
    });
});
function post(act){
    var str = $("#str").val();
    var key = $("#key").val();
    $.post("index.php?act="+act,{mystr:str,mykey:key},function(data){
        $("#result").html(data);
    });
}
</script>
</head>
<body>
<div id="main">
   <div class="demo">
           <textarea id="str" class="input" style="width:100%; height:80px">请输入字符串</textarea>
        密钥:<input type="text" class="input" id="key" value="www.wmdfw.com">
        <input type="button" value="加密" class="btn" id="encode">
        <input type="button" value="解密" class="btn" id="decode">
        <div id="result"></div>
    </div>
</div>
</body>
</html>

js加密解密

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>字符串加密</title>
<SCRIPT LANGUAGE="JavaScript">
//加密函数开始
function encrypt(str, key) {
  if(key == null || key.length <= 0) {
    alert("Please enter a password with which to encrypt the message.");
    return null;
  }
  var prand = "";
  for(var i=0; i<key.length; i++) {
    prand += key.charCodeAt(i).toString();
  }
  var sPos = Math.floor(prand.length / 5);
  var mult = parseInt(prand.charAt(sPos) + prand.charAt(sPos*2) + prand.charAt(sPos*3) + prand.charAt(sPos*4) + prand.charAt(sPos*5));
  var incr = Math.ceil(key.length / 2);
  var modu = Math.pow(2, 31) - 1;
  if(mult < 2) {
    alert("Algorithm cannot find a suitable hash. Please choose a different password. \nPossible considerations are to choose a more complex or longer password.");
    return null;
  }
  var salt = Math.round(Math.random() * 1000000000) % 100000000;
  prand += salt;
  while(prand.length > 10) {
    prand = (parseInt(prand.substring(0, 10)) + parseInt(prand.substring(10, prand.length))).toString();
  }
  prand = (mult * prand + incr) % modu;
  var enc_chr = "";
  var enc_str = "";
  for(var i=0; i<str.length; i++) {
    enc_chr = parseInt(str.charCodeAt(i) ^ Math.floor((prand / modu) * 255));
    if(enc_chr < 16) {
      enc_str += "0" + enc_chr.toString(16);
    } else enc_str += enc_chr.toString(16);
    prand = (mult * prand + incr) % modu;
  }
  salt = salt.toString(16);
  while(salt.length < 8)salt = "0" + salt;
  enc_str += salt;
  alert(enc_str);
document.write("加密后的字符是:");
document.write(enc_str);
document.write("<br>");
  return enc_str;

}
//加密函数结束

//解密函数开始
function decrypt(str, key) {
  if(str == null || str.length < 8) {
    alert("A salt value could not be extracted from the encrypted message because it‘s length is too short. The message cannot be decrypted.");
    return;
  }
  if(key == null || key.length <= 0) {
    alert("Please enter a password with which to decrypt the message.");
    return;
  }
  var prand = "";
  for(var i=0; i<key.length; i++) {
    prand += key.charCodeAt(i).toString();
  }
  var sPos = Math.floor(prand.length / 5);
  var mult = parseInt(prand.charAt(sPos) + prand.charAt(sPos*2) + prand.charAt(sPos*3) + prand.charAt(sPos*4) + prand.charAt(sPos*5));
  var incr = Math.round(key.length / 2);
  var modu = Math.pow(2, 31) - 1;
  var salt = parseInt(str.substring(str.length - 8, str.length), 16);
  str = str.substring(0, str.length - 8);
  prand += salt;
  while(prand.length > 10) {
    prand = (parseInt(prand.substring(0, 10)) + parseInt(prand.substring(10, prand.length))).toString();
  }
  prand = (mult * prand + incr) % modu;
  var enc_chr = "";
  var enc_str = "";
  for(var i=0; i<str.length; i+=2) {
    enc_chr = parseInt(parseInt(str.substring(i, i+2), 16) ^ Math.floor((prand / modu) * 255));
    enc_str += String.fromCharCode(enc_chr);
    prand = (mult * prand + incr) % modu;
  }
  alert(enc_str);
document.write("解密后的字符是:");
document.write(enc_str);
  return enc_str;

}
//解密函数结束

/*调用方式
var key="zhouein";
document.write("你输入的key是:");
document.write(key);
document.write("<br>");
var ipt="www.wmdfw.com";
encrypt(ipt, key);
var opt="83de93d9ba993f2d939ec395ed022f163d";
decrypt(opt, key);*/
</script>
</head>
<body>

<SCRIPT LANGUAGE="JavaScript">
var key="zhouein";
document.write("你输入的key是:");
document.write(key);
document.write("<br>");
var ipt="www.wmdfw.com";
encrypt(ipt, key);

var opt="83de93d9ba993f2d939ec395ed022f163d";
decrypt(opt, key);
</script>
</body>
</html>

时间: 2024-10-08 22:15:49

ajax_jsonp_php加密_跨域例子的相关文章

ajax跨域例子

例子 https://github.com/ruanyf/react-demos/blob/master/demo12/index.html 此网页代码运行在本地, 是可以访问 github 数据的. 是由于 github 网站开启的 ajax 跨域访问能力. 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8" /> 5 <script src="../b

11. cookie_session_原生ajax_readyState的值_同源策略_跨域_jsonp的使用

1. cookie 浏览器存储技术.(服务器将少量数据交于浏览器存储管理) 作用: 存储数据, 解决 http 协议无状态问题 工作流程: 浏览器发送请求给服务器,请求登录 服务器返回响应给浏览器,此时携带了cookie(其中包含着当前用户的唯一标识) 浏览器接受到响应中cookie,得保存下来 浏览器下一次发送请求时,会自动携带上cookie, 服务器接受到请求,解析cookie,从而判断是哪个用户发送的请求(解决http协议无状态问题) 服务器端的使用: 设置cookie        re

jsonp 实现跨域例子

直接上代码: js: <html> <head> <title>JSONP</title> </head> <script src = "jquery.js"></script> <script> $(function(){ $.ajax({ type:'POST', url : 'http://mainsite.service.com:8090/article/get/by/typeid'

http与websocket两种协议下的跨域基于ASP.NET MVC--竹子整理

这段时间,项目涉及到移动端,这就不可避免的涉及到了跨域的问题.这是本人第一次接触跨域,有些地方的配置是有点麻烦,导致一开始的不顺. 至于websocket具体是什么意义,用途如何:请百度. 简单说就是建立一个基于互联网的实时通信. 在这里整理下这些内容,方便日后回顾. 一:介绍了WebSocket下的基于SignalR的跨域与不跨域例子 二:简单介绍了Http下的跨域问题 Ⅰ.WebSocket下的跨域 如果使用原生的方法来开发WebSocket应用,还是比较复杂的,不过好在Asp.net给我们

谷歌浏览器报错:跨域问题处理( Access-Control-Allow-Origin)_ 用于本地测试的快捷解决方法

报错提示如下: XMLHttpRequest cannot load http://www.xxxx.com/264/Data/GetScreenInfo. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. 今天需要做一个本地测试,html中的js效果涉及跨域拉取数据的问题,Chrome报错并拒绝数

ajax成功跨域_自己写的

跨域的简单原理:一般浏览器会阻止js请求异端服务器(A服务器请求B服务器).js连接却除外 如:<script type="text/jscript" src="http://www.yourtour.cc/ajax_test.js"></script> 还有iframe.css.script  都可以进行异端请求数据. 本地html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 T

浅论ajax跨域!从一个例子开始!

//所谓跨域,简单来说就是去访问不是自己域名下的数据 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <button id="button" name="button" o

json _ ajax_跨域

1 json 1 js 对象 语法: 1 通过一对{}表示一个对象 2 在{}中允许通过 key:value 的形式来表示属性 3 多对的属性和值之间使用 , 隔开 2 什么中JSON 按照JS对象的格式所构建出来的字符串就是JSON串 在 ajax中,允许将复杂格式的响应数据(如列表等)构建成JSON格式的字符串再进行响应输出 3 JSON的表现 1 JSON表示单个对象 1 使用{}表示单个对象 2 在{}中使用key:value的格式表示数据 3 多对属性和值之间使用 ,隔开 4 key必

JSONP跨域的原理解析

JSONP跨域的原理解析 一种脚本注入行为 在 2011年10月27日 那天写的     已经有 99238 次阅读了 感谢 参考或原文 JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为"Same-Origin Policy"(同源策略).这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容. JavaScript这个安全策略在进