我猜猜,你看看对不对:注册cookie时,把原始数据根据$key做 异或位运算 然后再base64编码,($key如何取值并不重要)读取cookie时,把cookie中数据base64解码,然后按照同样的$key 做异或位运算 得到原始数据。
A 异或 B = C
C 异或 B = A

解决方案 »

  1.   

    恩,楼上的似乎有门道了,可是这里的运算是如何进行的呢,如果我直接对读取的COOKIE进行base64解码比如这里的BTxVX1oBWwRcBgMIBFYFUwICAwEGC10HCAZcCVkABAYHVQ%3D%3D这串字符解码得到的仍然是是乱码,关键是如何运算的,还请指点
      

  2.   

    关键在于
    $key= substr(md5($_SERVER["HTTP_USER_AGENT"].$GLOBALS['db_hash']),8,18);
    这个$key绝不是无所谓的!由于他使用了用户登陆名和数据库信息,所以对于任意用户来说都是唯一的其他的事情就是扰码了
    加密:
    输入串按字节与$key做异或运算
    返回结果的base64编码解密:
    base64解码后的输入串按字节与$key做异或运算
    返回结果如果你将md5($_SERVER["HTTP_USER_AGENT"].$GLOBALS['db_hash'])改为md5(1),使$key变成恒定值。那么这个函数就可以完成一般的加密解密工作,只是输入串的长度是有限制的
      

  3.   

    to 唠叨老大,搂住:
    首先为我的不负责任随便乱说而道歉。我的意思是说,$key对于产生的结果的影响都是异或运算的影响,至于如何产生的$key在结果来说,可以不必关心它。但是,话说回来这个算法的关键可能就是$key的选取了。
    下面我来猜测下选取这个东西的意义:
    对于不知道源代码的人来说,这样的加密,完全没有规律,base64解密后仍然是乱码,毫无规律,自然不必说。
    而对于知道源码的人来说,实际上这样的数据也很难获得。而恰恰这两个参数对于用户和服务器有可以算作是唯一且可重现的。因此用2个字符串的某个组合然后md5。:)至于base64当然是避免特殊字符的产生拉。对于8,18的选择,我就不知道是代表什么了,对于md5没仔细看过个人感觉好像随便哈。熟悉的人可以给个解答:P
    呵呵,唠叨老大也给批批,
    呵呵,要不是你说,我还真没有想这么多。
      

  4.   

    我想知道,知道源码&结果,但是不知道 $key ,可否获得原字符串?
      

  5.   

    谁说不能呢?$winduser = 'aaa';
    echo $winduser = StrCode($winduser,'ENCODE');//out AFED
    echo StrCode($winduser,'DECODE');//out aaafunction StrCode($string,$action='ENCODE'){
    //$key= substr(md5($_SERVER["HTTP_USER_AGENT"].$GLOBALS['db_hash']),8,18);
    $key = substr(md5(1),8,18);
    $string= $action == 'ENCODE' ? $string : base64_decode($string);
    $len= strlen($key);
    $code= '';
    for($i=0; $i<strlen($string); $i++){
    $k= $i % $len;
    $code  .= $string[$i] ^ $key[$k];
    }
    $code = $action == 'DECODE' ? $code : base64_encode($code);
    return $code;
    }注意,我修改了$key的生成代码,因为我不在你的环境中,无法取得相应的$_SERVER["HTTP_USER_AGENT"] 和 $GLOBALS['db_hash']
      

  6.   

    恩,明白了,最后一个问题这个DB_HASH是个什么东东呀
      

  7.   

    你的 config 文件应该有 DB_HASH 的设置,一个定值.我想知道,知道源码&结果,但是不知道 $key ,可否获得原字符串?有谁知道吗
      

  8.   

    应该是不行,知道源码本身没有任何用处,它是为了帮助你通过其它手段获取$key,就像唠叨老大为了解释问题而作的md5(1)这样的修改,你就能通过源码算出$key,这样就能知道原字符串了。
    但是,phpwind中所用的是用户自身信息和服务器信息的混合值,而服务器的信息别人又无法获取,因此这种方式才算有效。(其实就是找到一个只能在服务器端获取,并且能唯一表示一个登陆用户的这样的标识码来做$key,安全性跟这个$key的获取难度、仿造难度有关;另外一点存在的问题是,这个唯一是充分不必要条件还是充要条件,显然这里的是充分不必要条件,在实际中就会有可能由于一些变动导致之前的cookie的失效。   不过话说回来,这个不影响什么啦)
      

  9.   

    在 phpmyadmin 中,采用的是 Blowfish 算法来加密COOKIE,但 Blowfish 算法代码很长,
    而且经测试,运行效率很低.如果知道源码&结果,但是不知道 $key ,不能获得原字符串的话,不如用这个算法代替算了?