在Linux中使用MD5實(shí)現(xiàn)用戶驗(yàn)證的解決方法
使用openssl中的MD5函數(shù),該函數(shù)返回16字節(jié)的unsigned char類型的數(shù)據(jù),每個(gè)字節(jié)的范圍都在0~255間,把
它格式化為十六進(jìn)制就是32位md5編碼。注:一個(gè)字節(jié)為8位,正好可以表示2位的十六進(jìn)制。
使用登錄客戶端的用戶名從Redis數(shù)據(jù)庫中得到salt值和加密后的密碼,然后把登錄客戶端的密碼經(jīng)過salt加密后,與
Redis數(shù)據(jù)庫中的密碼進(jìn)行比較。相同則驗(yàn)證通過,否則驗(yàn)證失敗。
Redis數(shù)據(jù)庫中密碼的存儲格式為password:salt
用戶驗(yàn)證算法如下:
int user_authenticate(char *username, char *password)
{
char *salt_pw, *salt, *pw;
char buf[40];
char tmp[3]={'\0'}, md5_str[33]={'\0'};
unsigned char md[16];
int i;
//get_salt_pw調(diào)用Redis數(shù)據(jù)庫獲得password:salt
salt_pw = get_salt_pw(db, username);
pw = strtok(salt_pw, ":");
if(!pw){
return 0;
}
salt = strtok(NULL, ":");
if(!salt){
return 0;
}
strcpy(buf, password);
strcat(buf, salt);
MD5((const unsigned char*)buf, strlen(buf), md);
//transform to md5 string
for(i = 0; i < 16; i++){
sprintf(tmp, "%02x", md[i]);
strcat(md5_str, tmp);
}
//compare encode password using md5
if(strcmp((char*)md5_str, pw)){
return 0;
}
return 1;
}
其中要注意strtok函數(shù)的使用,以及16字節(jié)的unsigned char轉(zhuǎn)換為32位十六進(jìn)制數(shù)的過程。
相關(guān)文章
Linux(ubuntu)下實(shí)現(xiàn)增加/刪除文件權(quán)限
下面小編就為大家分享一篇Linux(ubuntu)下實(shí)現(xiàn)增加/刪除文件權(quán)限,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04Apache、Nginx下Font Awesome在 Firefox 中不顯示問題解決方法
這篇文章主要介紹了Apache、Nginx下Font Awesome在 Firefox 中不顯示問題解決方法,在配置中增加一個(gè)響應(yīng)頭即可解決這個(gè)問題,需要的朋友可以參考下2014-07-07Linux中g(shù)it用https連接時(shí)不用每次輸入密碼的方法
這篇文章主要給大家介紹了關(guān)于Linux中g(shù)it使用https連接時(shí)不用每次輸入密碼的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06Apache Spark 2.0 在作業(yè)完成時(shí)卻花費(fèi)很長時(shí)間結(jié)束
大家在使用 Apache Spark 2.x 的時(shí)候可能會遇到這種現(xiàn)象:雖然我們的 Spark Jobs 已經(jīng)全部完成了,但是我們的程序卻還在執(zhí)行。怎么回事呢?下面小編通過實(shí)例代碼給大家介紹下2019-06-06Centos7.4環(huán)境安裝lamp-php7.0教程
這篇文章主要介紹了Centos7.4環(huán)境安裝lamp-php7.0,較為詳細(xì)的分析了CentOS7.4環(huán)境下Apache、mysql、php7.0及phpmyadmin等安裝命令與操作注意事項(xiàng),需要的朋友可以參考下2019-03-03