V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
workaholic
V2EX  ›  程序员

求get请求中参数加密解密算法

  •  
  •   workaholic · 2013-04-22 10:19:54 +08:00 · 7008 次点击
    这是一个创建于 4229 天前的主题,其中的信息可能已经有所发展或是发生改变。
    求get请求中参数加密解密算法,例如id值,加密后最好是定长的,字母和数字组合,谢谢
    第 1 条附言  ·  2013-04-22 17:18:42 +08:00
    例如一个id整数值 加密成 51490d5ec2ea581014000508
    28 条回复    1970-01-01 08:00:00 +08:00
    xing393939
        1
    xing393939  
       2013-04-22 10:22:24 +08:00
    办法太多了吧,自己弄个就行,用网上的说不定一眼就被人看出来了
    workaholic
        2
    workaholic  
    OP
       2013-04-22 10:24:53 +08:00
    @xing393939 恩,感觉自己写的不太靠谱,最好有开源的,因为要长久使用
    avichen
        3
    avichen  
       2013-04-22 10:27:47 +08:00   ❤️ 1
    找一个可逆的加密算法不就可以了?
    workaholic
        4
    workaholic  
    OP
       2013-04-22 10:32:21 +08:00
    都不太理想,主要是结果太长,而且容易造成url数据出错(有特殊字符),希望找个短一些的,固定长度最好,字母数字组合最好
    lululau
        5
    lululau  
       2013-04-22 10:54:47 +08:00
    什么应用场景?防作弊?用普通的对称加密,AES/DES 即可
    BOYPT
        6
    BOYPT  
       2013-04-22 11:13:44 +08:00
    定长这个要求就难了。

    不定长AES/DES然后urlencode就好。
    ayang23
        7
    ayang23  
       2013-04-22 11:21:02 +08:00
    难道是想防窃听?对称加密怎么加都解决不了这个问题。考虑用非对称的吧。重要数据用post比较方便吧、、
    master
        8
    master  
       2013-04-22 11:35:59 +08:00
    避免url数据出错没啥,不管啥加密到url最保险的做法基本都是最后BASE64+urlencode吧。。。。。。如果数据本身就长的话,那这么做肯定就更长了。。。。尽可能还是避免get,能post的还是post吧。
    Cadina
        9
    Cadina  
       2013-04-22 11:37:37 +08:00   ❤️ 1
    @workaholic 加密成二进制数据后,用十六进制编码不就可以了?
    xing393939
        10
    xing393939  
       2013-04-22 13:37:07 +08:00
    workaholic
        11
    workaholic  
    OP
       2013-04-22 17:06:10 +08:00
    @ayang23 不是。这个还真避免不了,因为是放在用户网页里面的一个链接,需要存id值
    workaholic
        12
    workaholic  
    OP
       2013-04-22 17:11:02 +08:00
    @xing393939 谢谢,但是测试了不准,2147483642就不行
    workaholic
        13
    workaholic  
    OP
       2013-04-22 17:16:32 +08:00
    @Cadina 这个看起来太明显了,例如 7FFFFFFF
    binux
        14
    binux  
       2013-04-22 17:48:07 +08:00
    条件不明,要求固定长度,但是又不知道你id的长度范围,怎么固定?
    需求不明,是不想被中间人知道,还是不想被用户端知道,亦或者仅仅不想在get中展示?
    workaholic
        15
    workaholic  
    OP
       2013-04-22 17:52:57 +08:00
    @binux 你的逻辑我很是佩服
    hpyhacking
        16
    hpyhacking  
       2013-04-22 20:22:08 +08:00
    @binux
    @workaholic

    一般这种情况是不想被用户端知道吧。
    qq286735628
        17
    qq286735628  
       2013-04-22 20:24:03 +08:00
    之前用过RC4+URLencode
    ljbha007
        18
    ljbha007  
       2013-04-22 20:28:53 +08:00
    最简单的办法就是用个密码字符串转成数字然后和ID异或
    解密的时候就再异或一次就得到原来的ID了
    只要猜不出来密码字符串就很难破解
    binux
        19
    binux  
       2013-04-22 21:12:02 +08:00
    如果是不想被用户端知道,那根本就用不着什么加解密算法啊,随便给id建一个映射,保存在服务器端,把key发给用户端就好了,需要id的时候再转回来就完了
    V2SK
        20
    V2SK  
       2013-04-22 21:53:51 +08:00
    @binux 这种方法不可靠吧,加密的目的就是让用户猜不到,建不建映射不都一样么
    V2SK
        21
    V2SK  
       2013-04-22 21:54:49 +08:00
    @hpyhacking 肯定了,所以说我比较佩服@binux的逻辑嘛
    workaholic
        22
    workaholic  
    OP
       2013-04-22 21:58:42 +08:00
    @ljbha007 恩,这个强度已经足够了,discuz的加密方法就是用的异或,非常经典
    WellWiFi
        23
    WellWiFi  
       2013-04-23 00:46:06 +08:00 via iPhone
    告诉你个简单办法,如果是1开头,设置1对应xx,2对应xx8,如果是2开头走一个路线设置1对应mm,2对应 k,然后13开头是一种对应方式,解密逆向就行了,非常简单58就是这么做,我还没解开密码,也可以用每过一段时间换一套方法
    xing393939
        24
    xing393939  
       2013-04-23 09:56:25 +08:00
    xing393939
        25
    xing393939  
       2013-04-23 09:56:54 +08:00
    @workaholic
    <?php

    $a = encode(2147483642);
    echo $a, '<br/>';
    $b = decode($a);
    echo $b;

    function encode($id) {
    if($id > 100) {
    $id = (string) $id;
    $len = strlen($id) - 1;
    $id = $id{0} . $id{$len} . substr($id, 2, -1). $id{1};
    }
    $id += 60512868;
    $str = base_convert($id, 10, 36);
    $str = substr($str, 0, -2) . xchange($str{4}) . xchange($str{5});
    return $str;
    }

    function decode($str) {
    $str = substr($str, 0, -2) . xchange($str{4}, 1) . xchange($str{5}, 1);
    $id = base_convert($str, 36, 10);
    $id -= 60512868;
    if($id > 100) {
    $id = (string) $id;
    $len = strlen($id) - 1;
    return $id{0} . $id{$len} . substr($id, 2, -1). $id{1};
    } else {
    return $id;
    }
    }

    function xchange($s, $decode = 0) {
    if($decode) {
    $str = "ytuvsrqzxwilng7fed2cbajk1096h53m8o4p";
    } else {
    $str = "poiuytrewqlkjhgfdsamnbvcxz6541239807";
    }
    $s = base_convert($s, 36, 10);
    return $str{$s};
    }
    ?>
    xing393939
        26
    xing393939  
       2013-04-23 09:59:54 +08:00   ❤️ 1
    sorry 看错了 是有问题,应该是个bug,有时间修复下
    xing393939
        27
    xing393939  
       2013-04-23 10:24:27 +08:00
    <?php

    $a = encode(2147483642);
    echo $a, '<br/>';
    $b = decode($a);
    echo $b;

    $time=microtime(1);
    for ($i=0;$i<100000;$i++)
    hash('md5', 'string');
    echo microtime(1)-$time,': hash/md5<br>';

    $time=microtime(1);
    for ($i=1;$i<200;$i++) {
    $s = encode($i);
    //echo $s, '<br>';
    echo decode($s), '<br>';

    }
    echo microtime(1)-$time,': jia/jie<br>';

    function encode($id)
    {
    if ($id > 100) {
    $id = (string)$id;
    $len = strlen($id) - 1;
    $id = $id{0} . $id{$len} . substr($id, 2, -1) . $id{1};
    }
    $id += 60512868;
    $str = base_convert($id, 10, 36);
    $l = strlen($str);
    $str = substr($str, 0, $l - 2) . xchange(substr($str, -2, 1)) . xchange(substr($str, -1));
    return $str;
    }

    function decode($str)
    {
    $l = strlen($str);
    $str = substr($str, 0, $l - 2) . xchange(substr($str, -2, 1), 1) . xchange(substr($str, -1), 1);
    $id = base_convert($str, 36, 10);
    $id -= 60512868;
    if ($id > 100) {
    $id = (string)$id;
    $len = strlen($id) - 1;
    return $id{0} . $id{$len} . substr($id, 2, -1) . $id{1};
    } else {
    return $id;
    }
    }

    function xchange($s, $decode = 0)
    {
    if ($decode) {
    $str = "ytuvsrqzxwilng7fed2cbajk1096h53m8o4p";
    } else {
    $str = "poiuytrewqlkjhgfdsamnbvcxz6541239807";
    }
    $s = base_convert($s, 36, 10);
    return $str{$s};
    }

    ?>
    summic
        28
    summic  
       2013-04-23 18:28:02 +08:00
    @xing393939 小六真帅!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3216 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 13:19 · PVG 21:19 · LAX 05:19 · JFK 08:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.