返回信息流RT
这是一条镜像帖。来源:北邮人论坛 / security / #33976同步于 2012/2/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Security机器人发帖
【求教】byr论坛的密码是什么格式的加密文件?
wdx01
2012/2/29镜像同步1 回复
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
【 在 wdx01 的大作中提到: 】
: RT
它的加密函数为:
void igenpass(const char *passwd, const char *userid, unsigned char md5passwd[])
{
static const char passmagic[] = "wwj&kcn4SMTHBBS MD5 p9w2d gen2rat8, //grin~~, 2001/5/7";
MD5_CTX md5;
MD5Init(&md5);
/* update size > 128 */
MD5Update(&md5, (unsigned char *) passmagic, strlen(passmagic));
MD5Update(&md5, (unsigned char *) passwd, strlen(passwd));
MD5Update(&md5, (unsigned char *) passmagic, strlen(passmagic));
MD5Update(&md5, (unsigned char *) userid, strlen(userid));
MD5Final(md5passwd, &md5);
}
这个函数中,输入为passwd和userid,输出为md5passwd[],是一个16位的hash。
由此函数可见,最后的密码经过了4次加工,与passmagic,密码,和用户名相关。
再看用户登录时的验证函数,如下所示
int checkpasswd2(const char *passwd, const struct userec *user)
{
#ifdef CONV_PASS
if (user->passwd[0]) {
return checkpasswd(user->passwd, passwd);
} else
#endif
{
unsigned char md5passwd[MD5_DIGEST_LENGTH];
igenpass(passwd, user->userid, md5passwd);
/*
if (memcmp(md5passwd,user->md5passwd,MD5_DIGEST_LENGTH)) {
unsigned char w_md5passwd[MD5_DIGEST_LENGTH];
w_igenpass(passwd,user->userid,w_md5passwd);
if (memcmp(w_md5passwd,user->md5passwd,MD5_DIGEST_LENGTH)) return 0;
memcpy(user->md5passwd,md5passwd,MD5_DIGEST_LENGTH);
bbslog("5system","Convert %s password.",user->userid);
}
return 1;
*/
return !(memcmp(md5passwd, user->md5passwd, MD5_DIGEST_LENGTH));
}
}
输入参数passwd为用户提交的明文密码,user指向.PASSWDS文件中对应的用户。
可见它是通过加密后用 memcmp 进行比较密文的