⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cryptdemo.c.txt

📁 linux 基本加密库函数实现信息加密AES DES
💻 TXT
字号:
#include 
#include 
#include 
typedef struct { 
char username[64]; 
char passwd[16]; 
int uid; 
int gid; 
char name[256]; 
char root[256]; 
char shell[256]; 
} account; 
/* 注意! 以下的写法,真实世界的软体开发状况下,千万不要用! */ 
int acc_info(char *info,account *user) 
{ 
char * start = info; 
char * now = info; 
/* username */ 
while (*now&&*now!=':') now++; /* 这是超级大安全漏洞 */ 
if (!*now) return 0; 
*now = 0; now++; 
strcpy(user->username,start); /* 这会导致buffer overflow */ 
start = now; 
/* passwd */ 
while (*now&&*now!=':') now++; /* 这是超级大安全漏洞 */ 
if (!*now) return 0; 
*now = 0; now++; 
strcpy(user->passwd,start); /* 这会导致buffer overflow */ 
start = now; 
/* uid */ 
while (*now&&*now!=':') now++; 
if (!*now) return 0; 
*now = 0; now++; 
user->uid = atoi(start); 
start = now; 
/* gid */ 
while (*now&&*now!=':') now++; 
if (!*now) return 0; 
*now = 0; now++; 
user->gid = atoi(start); 
start = now; 
/* name */ 
while (*now&&*now!=':') now++; /* 这是超级大安全漏洞 */ 
if (!*now) return 0; 
*now = 0; now++; 
strcpy(user->name,start); /* 这会导致buffer overflow */ 
start = now; 
/* root */ 
while (*now&&*now!=':') now++; /* 这是超级大安全漏洞 */ 
if (!*now) return 0; 
*now = 0; now++; 
strcpy(user->root,start); /* 这会导致buffer overflow */ 
start = now; 
/* shell */ 
while (*now&&*now!=':') now++; /* 这是超级大安全漏洞 */ 
*now = 0; now++; 
strcpy(user->shell,start); /* 这会导致buffer overflow */ 
start = now; 
return 1; 
} 
int read_password(char *filename,account *users) 
{ 
FILE *fp; 
char buf[1024]; 
int n; 
n = 0; 
fp = fopen(filename,"rt"); 
while (fgets(buf,1024,fp)!=NULL) { 
if (acc_info(buf,&users[n])) n++; 
} 
fclose(fp); 
return n; 
} 
void main(int argc,char **argv) 
{ 
int n,i,done; 
account ACC[128]; 
char username[256]; 
char password[256]; 
char * passwd; 
char salt[4]; 
if (argc<2) { 
printf("username:"); 
scanf("%s",username); /* 这是超级大安全漏洞 */ 
} else strcpy(username,argv[1]); /* 这是超级大安全漏洞 */ 
if (argc<3) { 
printf("password:"); 
scanf("%s",password); /* 这是超级大安全漏洞 */ 
} else strcpy(password,argv[2]); /* 这是超级大安全漏洞 */ 
n = read_password("/etc/passwd",ACC); 
for (i=0,done=0;i if (strcmp(username,ACC.username)==0) { 
salt[0] = ACC.passwd[0]; 
salt[1] = ACC.passwd[1]; 
salt[2] = 0; 
passwd = crypt(password,salt); 
printf("%s %s %s\n",ACC.username,ACC.passwd,passwd); 
if (strcmp(passwd,ACC.passwd)==0) { 
printf("login successfully!\n"); 
} else { 
printf("incorrect password!\n"); 
} 
done = 1; 
} 
if (!done) printf("invalid username!\n"); 
} 
编译 
gcc -o verify_passwd verify_passwd.c -lcrypt 
检验 
./verify_passwd your_username your_password 
避免安全漏洞 
buffer overflow是个很严重的安全漏洞,通常您不可使用像char buf[xxxx]的 宣告。在这一类与安全有相关的任何程式写作中(不是只有密码,例如像 www/ftp/telnet的这一类对外窗口都要算在内),您应该要先检查字串长度。例 如以下例子: 
len = strlen(incoming_username); 
if (len>xxx) invalid; 
new_string = (char*)malloc(len+1); 
strcpy(new_string,incoming_username); 
your_own_operations... 
如此才能避免buffer overflow,万万不可滥做假设,切记切记,连许多数十年经验丰富的老手都会犯这个错误。 
与crypt函数相关者尚有以下三个: 
void setkey (const char *key); 
void encrypt (char *block, int edflag); 
void swab (const char *from, char *to, ssize_t n); 
一般来说,除非您有特殊需求,你不会用到这三个。 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -