JS的高手呀,过来看看吧,我是只会些PHP,懂一点点的JS皮毛。

解决方案 »

  1.   

    工程挺大的,自己修改的挺头大,你可以参考别人写的稍加修改一下
    http://hi.baidu.com/suidxfzggebjmqq/item/aaa6259751875bf229164794
      

  2.   


    主要是没有经过时间的沉淀,稳定不稳定还不知道呀。稳定性在加密与解密当中是相当重要的。其次才是加密强度,我是这样认为的。以前看别人弄的base64,结果有些无法解密。太扯蛋了。
      

  3.   

    @sibang :DX用到的加密解密算法当中用到了base64_decode、md5,这个你不用关心,我有现成的JS版,可以直接使用,你能把其它的代码转换成JS吗???
      

  4.   

    只要base64没问题,别的都很简单啊
      

  5.   

    你写一个substr函数吧,然后我帮你把php转成js
    substr($key, 0, 16)这个函数用来从string类型的变量$key左侧抓取16位ord用来返回字符的 ASCII 码值这俩函数搞定了就没难点了.
      

  6.   

    开玩笑吧?js 的string 提供有
    substr 方法
    返回一个从指定位置开始的指定长度的子字符串。substring 方法
    返回位于 String 对象中指定位置的子字符串。 
      

  7.   

    js中不晓得那些函数与PHP中的这些相对应range(0, 255)、chr、ord,所以弄了一下,不成功,才来这里求助的。我不经常写js,如果用也是jquery。目前出现的PHP问题我都能解决掉,但JS的话,必须要找高手了,毕竟我不擅长,而且我的发展方向为后端或者运维。版主也来了,那就写个完全的吧,也好测试,为web2.0做点贡献,毕竟很少的网站才会做前端加密的。
    PS:虽然我的小博客用了前端登录加密,但不通用,因此才想找一款适合前端加密的函数。希望版主能够理解。
      

  8.   

    PHP           对应 js
    chr           String.fromCharCode
    ord           String.charCodeAt
    range(0, 255) new Array(256); 然后循环充填由于涉及字符集问题(js 始终使用unicode),直译后与php不对等,没有大大意义
      

  9.   

    弱弱的问下:直译后不对等,难道没有解决的办法?版主,如果文件编码用utf-8,PHP也用utf-8,这样呢????
      

  10.   

    没有解决的办法?
    我想应该有,不过应该很麻烦
    你不是有 js 版的 base64 吗?你可用它对中文进行编解码测试一下
      

  11.   

    不弄了,好难呀。本来是想把DX论坛用的authcode弄成JS版,汗,感觉以我的水平不太现实。
      

  12.   

    我今天实现了一个node.js版本authcode 有人要吗
      

  13.   

    function authcode(str, operation, key, expiry) {
    var operation = operation ? operation : 'DECODE';
    var key = key ? key : '';
    var expiry = expiry ? expiry : 0;

    var ckey_length = 4;
    key = md5(key);

    // 密匙a会参与加解密
    var keya = md5(key.substr(0, 16));
    // 密匙b会用来做数据完整性验证
    var keyb = md5(key.substr(16, 16));
    // 密匙c用于变化生成的密文
    var keyc = ckey_length ? (operation == 'DECODE' ? str.substr(0, ckey_length): md5(microtime()).substr(-ckey_length)) : '';
    // 参与运算的密匙
    var cryptkey = keya+md5(keya+keyc);

    var strbuf;
    if(operation == 'DECODE') {
    str = str.substr(ckey_length);
    strbuf = new Buffer(str,'base64');
    //string = b.toString();
    }
    else {
    expiry = expiry ? expiry + time() : 0;
    tmpstr = expiry.toString();
    if(tmpstr.length>=10)
            str = tmpstr.substr(0,10)+md5(str+keyb).substr(0, 16)+str;
        else {
        var count = 10 - tmpstr.length;
            for(var i=0;i<count;i++) {
             tmpstr = '0'+tmpstr;
            } 
            str = tmpstr+md5(str+keyb).substr(0, 16)+str;
         }
            strbuf = new Buffer(str);
    }
    var box = new Array(256);
    for(var i=0; i < 256; i++) {
    box[i] = i;
    }
    var rndkey = new Array();
    // 产生密匙簿
    for(var i=0; i < 256; i++) {  
        rndkey[i] = cryptkey.charCodeAt(i % cryptkey.length);
    }
    // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度  
    for(var j = i = 0; i < 256; i++) {  
        j = (j + box[i] + rndkey[i]) % 256;  
        tmp = box[i];  
        box[i] = box[j];  
        box[j] = tmp;  
    }


    // 核心加解密部分
    var s = '';
    for(var a = j = i = 0; i < strbuf.length; i++) {
        a = (a + 1) % 256;
        j = (j + box[a]) % 256;
        tmp = box[a];
        box[a] = box[j];
        box[j] = tmp;
        // 从密匙簿得出密匙进行异或,再转成字符
        //s += String.fromCharCode(string[i] ^ (box[(box[a] + box[j]) % 256]));
        strbuf[i] = strbuf[i] ^ (box[(box[a] + box[j]) % 256])
    } if(operation == 'DECODE') {
    var s = strbuf.toString();
    if((s.substr(0, 10) == 0 || s.substr( 0, 10) - time() > 0) && s.substr(10, 16) == md5(s.substr(26)+keyb).substr(0, 16)) {
        s = s.substr(26);
    } else {
        s = '';
    }
    }
    else {
    var s = strbuf.toString('base64'); var regex = new RegExp('=', "g");
    s = s.replace(regex, '');
    s = keyc+s;
    } return s;
    }function md5(str){
        var hash = require('crypto').createHash('md5');
        return hash.update(str+"").digest('hex');
    }function time() {
    var unixtime_ms = new Date().getTime();
        return parseInt(unixtime_ms / 1000);
    }function microtime(get_as_float) {
    var unixtime_ms = new Date().getTime();
        var sec = parseInt(unixtime_ms / 1000);
        return get_as_float ? (unixtime_ms/1000) : (unixtime_ms - (sec * 1000))/1000 + ' ' + sec;
    }//console.log(authcode('4961CxOTjLPyesRm0Qips70cCaFJzgCZg4F4GGMiDVQ','DECODE','key'));
    //console.log(authcode('abc','ENCODE','key'));
      

  14.   

    function authcode(str, operation, key, expiry) {
    var operation = operation ? operation : 'DECODE';
    var key = key ? key : '';
    var expiry = expiry ? expiry : 0; var ckey_length = 4;
    key =  md5(key); // 密匙a会参与加解密
    var keya = md5(key.substr(0, 16));
    // 密匙b会用来做数据完整性验证
    var keyb = md5(key.substr(16, 16));
    // 密匙c用于变化生成的密文
    var keyc = ckey_length ? (operation == 'DECODE' ? str.substr(0, ckey_length): md5(microtime()).substr(-ckey_length)) : '';
    // 参与运算的密匙
    var cryptkey = keya+md5(keya+keyc); var strbuf;
    if(operation == 'DECODE') {
    str = str.substr(ckey_length);
    strbuf = Base64.decode(str);
    //string = b.toString();
    }
    else {
    expiry = expiry ? expiry + time() : 0;
    tmpstr = expiry.toString();
    if(tmpstr.length>=10)
    str = tmpstr.substr(0,10)+md5(str+keyb).substr(0, 16)+str;
    else {
    var count = 10 - tmpstr.length;
    for(var i=0;i<count;i++) {
     tmpstr = '0'+tmpstr;
    }
    str = tmpstr+md5(str+keyb).substr(0, 16)+str;
    }
    strbuf = str;
    }
    var box = new Array(256);
    for(var i=0; i < 256; i++) {
    box[i] = i;
    }
    var rndkey = new Array();
    // 产生密匙簿
    for(var i=0; i < 256; i++) {
    rndkey[i] = cryptkey.charCodeAt(i % cryptkey.length);
    }
    // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度
    for(var j = i = 0; i < 256; i++) {
    j = (j + box[i] + rndkey[i]) % 256;
    tmp = box[i];
    box[i] = box[j];
    box[j] = tmp;
    }
    // 核心加解密部分
    var s = '';
    for(var a = j = i = 0; i < strbuf.length; i++) {
    a = (a + 1) % 256;
    j = (j + box[a]) % 256;
    tmp = box[a];
    box[a] = box[j];
    box[j] = tmp;
    // 从密匙簿得出密匙进行异或,再转成字符
    s += chr(ord(strbuf[i]) ^ (box[(box[a] + box[j]) % 256]));
    } if(operation == 'DECODE') {
    if((s.substr(0, 10) == 0 || s.substr( 0, 10) - time() > 0) && s.substr(10, 16) == md5(s.substr(26)+keyb).substr(0, 16)) {
    s = s.substr(26);
    } else {
    s = '';
    }
    }
    else {
    s = Base64.encode(s);
    var regex = new RegExp('=', "g");
    s = s.replace(regex, '');
    s = keyc+s;
    } return s;
    }function time() {
    var unixtime_ms = new Date().getTime();
    return parseInt(unixtime_ms / 1000);
    }function microtime(get_as_float) {
    var unixtime_ms = new Date().getTime();
    var sec = parseInt(unixtime_ms / 1000);
    return get_as_float ? (unixtime_ms/1000) : (unixtime_ms - (sec * 1000))/1000 + ' ' + sec;
    }
    function chr(s){return String.fromCharCode(s);}
    function ord(s){return s.charCodeAt();}纯JS的,需要自己先加载 MD5.js 和 base64.js 分别实现 MD5 和 base64
      

  15.   


    这个方法  思路是对的 
    但是有一个小问题 就是 中文加密的问题 
    你的md5  对中文加密的话会和PHP 不一致 
    应该 改成 function md5(str){
      var Buffer = require('buffer').Buffer
      var buf = new Buffer(1024);
      var len = buf.write(str, 0);
      str = buf.toString('binary', 0, len);  var md5sum = require('crypto').createHash('md5');
      md5sum.update(str);
      str = md5sum.digest('hex');
      return str;
    }