Discuz!NT官方社区

首页 » Discuz!NT开发与测试 » Discuz!NT整合 » 帮个忙 C#站点整合DISCUZ6 authcode函数已实现 最后一步...
NAVYMK - 2007-12-14 0:15:00
既然是discuz6,肯定是指php版本了.但是一直是用c#在做程序,想必这里志同道合者会比较多.

还是cookie的问题.好象nt下cookie的设置与php的又不同了,但大概思路都差不多吧应该.只是个猜测.

我的目的是完全自主控制discuz的cookie设置,否则也不会在办公室加班到这么晚.

事先说一句:我还没实现呢.


d6的登陆原理,我所知道的大概是这个样子:

检测晚用户名密码后,dsetcookie,并对$value做authcode加密.

authcode加密函数的工作原理是:将authkey做md5加密然后再把要加密的字串与加密后的key连接后再做一次md5加密,然后取前8位放到要加密的内容之前.然后用ascii开始打散,然后将打散的字串恢复成string之后再做一次base64加密,最后把=号都replace了.具体代码我不贴了.

解密时,将base64码转回来,然后将打散过程重复一遍,就回到8位md5+string的状态,然后取前8位.

下面是c#改写的authcode函数,网上的代码我所搜到的都不能正常运行,是因为decode64的时候,会对asc码有不正确的转换,某些双字节被认成单个的汉字,造成字符串数量判断不正确,所以无法正确转码.以下是我改进的代码,照着authcode写的

///str 要处理的字串
///ENCODE 判断加密或者解密
private string DiscuzEncode(string str, bool ENCODE)       
{
        string key = md5("1cf91aNAqrlWXaAE");
        int key_length = key.Length;

        byte[] rndkey = new byte[256];
        int[] box = new int[256];
        string result = "";

        //以下为打散过程
        byte[] keyBytes = Encoding.ASCII.GetBytes(key.ToCharArray());
        for (int i = 0; i < 256; i++)
        {
                rndkey[i] = keyBytes[i % key_length];
                box[i] = i;
        }
        for (int i = 0, j = 0; i < 256; i++)
        {
                j = (j + box[i] + rndkey[i]) % 256;
                int tmp = box[i];
                box[i] = box[j];
                box[j] = tmp;
        }

        byte[] strBytes =
                ENCODE ?
                Encoding.ASCII.GetBytes((md5(str + key).Substring(0, 8) + str).ToCharArray()) //加密字串算法 并转换为char[]
                :
                Convert.FromBase64String((str.Length % 4 == 0) ? str : (str + "====".Substring(str.Length % 4)));  //补齐base64
        byte[] resultBytes = new byte[strBytes.Length];
        for (int a = 0, i = 0, j = 0; i < strBytes.Length; i++)
        {
                a = (a + 1) % 256;
                j = (j + box[a]) % 256;
                int tmp = box[a];
                box[a] = box[j];
                box[j] = tmp;
                resultBytes[i] = (byte)(strBytes[i] ^ (box[(box[a] + box[j]) % 256]));
        }

        char[] resultChar = ASCIIEncoding.Default.GetChars(resultBytes);
        foreach (char c in resultChar)
        {
                result += c;
        }
        if (ENCODE)
        {
                return Convert.ToBase64String(Encoding.Default.GetBytes(result));
        }
        else
        {
                return result.Substring(8);
        }
}


所做的改进无非是在转换的时候不以string的形态出现,一直用byte[].

这个最后生成的代码应该是一段base64代码.

在d6官网中,cookie的auth段代码如下

cdb_auth
zHm7lonB4aS00zUgzIk%2FtdVjXHECRP4KD98hg%2FRoGrqYwhJ12M031XDpQMJeUgMu
discuz.net/
1536
1786759808
30634227
3156944288
29899972


以下的代码是否就是加密的那段代码?

zHm7lonB4aS00zUgzIk%2FtdVjXHECRP4KD98hg%2FRoGrqYwhJ12M031XDpQMJeUgMu


但这不是一段base64代码.我现在卡在这里了,不知道这段代码又是从哪里来的.还是我根本就没弄明白cookie.

请各位不吝回贴,告诉我怎么具体来读取处理cookie数据.别惊讶,我真的水平很一般,连怎么读取都是一盆糨糊.request.cookies["cdb_auth"]?怎么读取不出来呢?
no10pc - 2007-12-15 21:12:00

这么好的工具不用太浪费了.
上面列出的COOKIES是我看你的贴子取到的值.你可以在DISCUZ6里把这些值取到.
那个加密串的方法
http://nt.discuz.net/space/viewspacepost.aspx?postid=745
里面的代码.是.NET版的.加密算法有可能不一样.你看看吧.
1
查看完整版本: 帮个忙 C#站点整合DISCUZ6 authcode函数已实现 最后一步...