发信人: j_zh()
整理人: williamlong(2000-08-10 10:38:05), 站内信件
|
struct TOicqPtoP
{
char Tag1; // 0x02 // 显然是 Oicq 的协议编号 or 版本,固定
char Tag2; // 0x01 // 显然是 Oicq 的协议编号 or 版本,固定
char Tag3; // 0x07
char Tag4; // 0x00
char Tag5; // 0x78
char Tag6; // 这两个字节相当于 unix 上的进程 ID,
char Tag7; // 随便赋值就可。
char cOicqNub[]; // 发送方的Oicq 号码。 exp:123456
char cFF; // 0x1f 在所有的Oicq 信息结构中,分割符都是 0x1f
char cR; // '0' 固定
char cFF; //
char cE[]; // "75" ,这一位相对固定,可能是操作方式。
char cFF;
char cDateTime[]; // exp: "2000-4-10",0x1f,"12:00:12",0x1f
char OutMsg[]; // 发送的消息内容。
char cEnd; // 0x03 ,所有的 oicq 信息都已 0x03 为标记结束。
};
以上一段为引用。
分析可知它根本没有防止此类攻击的能力!我们来探讨一下,是否加上一个 随机口令认证:
假设用户A在OICQ启动的时候,产生一随机码(不是服务器产生,减轻服务器 的任务),登陆到服务器,服务器记录下随机码后,将随机码通知给A的在线好友 ,并将好友的随机码送给A,当每次进行通讯的时候,随机码就做为一个口令,在 OutMsg中传输,口令不通过,就作为虚假信息!注意,发送和接受的口令是不一 样的!
是不是就完全安全了,不是的。假设A、B、C三个人,A、B、C互为好友,那 么就是B和C同时获得了A的口令,如果C此时想伪造B的消息,那是很容易的,因为 C同时有A的口令,也有B的IP地址,就可以轻松地伪造B的消息。(我没有做过验证 ,有兴趣的朋友可以一试。)
作为一个包,如果想截取——只要想,就总有办法,也就不存在多大的安全 性,就需要对包内容进行加密,最好的办法是两者之间的密钥是他人所不知的, 那么刚才的A、B、C三者之间,就需要3个密钥。现在再假设:
A登陆到服务器,发送一个随机码,在线的B和C都得到了A的随机码,产生和 A联系的初权,在B和C向A通过初权联系的时候,AB、AC分别再进行二次密码协定 ,也可以是通过随机产生,此时的密码随机产生最好是B和C执行:
A--->server server--->B B---->A A---->B
server--->C C---->A A---->C
B--->A的包中是由加密的初权做认证,同时发送下次通讯加密的密码;A--- >B的包是一个加密回应,验证密码,B如果收不到回应N次后,做失败处理。
上面一个服务器的处理不多了,但还是有漏洞的。
最好是A上线(不用产生随机码)后,服务器通知B,B产生相对其他用户不同 唯一的随机码后,发送给server,由server将随机码发送给A,那么,A和B的随机 码对其他用户是不可知的,每次也是不一样的,A和B的通讯验证就必须通过此有 权信号。即使受到攻击(穷举),只要下线后上线就可以了。做得更好的程序, 就是通过server即时换一个密钥!我想这个过程不要我再说了。
这种方法,在由HUB为节点组成的星形局域网,还是不可靠的,如果是Switc her就好点了。
-- 我喜欢...... ......睡觉
我爱...... ......巧克力
我是...... ......动物??
我真的...... ......不想说话
————————————————————————
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 61.132.43.72]
|
|