1. 程式人生 > >linux數據庫中使用MD5加密

linux數據庫中使用MD5加密

insert lba log 字符 sele div sql 技術 sqlite

MD5加密算法源碼下載:https://pan.baidu.com/s/1nwyN0xV

下載完成了之後解壓,得到兩個文件

技術分享圖片

環境搭建:

1、把md5.h文件拷貝到/usr/include/目錄下

sudo cp md5.h /usr/include

2、編譯生成.o文件

 gcc -fPIC -o md5.o -c md5.c -lpthread -ldl

3、編譯生成.so文件

gcc -shared -fPIC -o libmd5.so md5.o -lpthread -ldl

4、把生成的.so文件拷貝都/lib/目錄下,方便使用

sudo cp libmd5.so /lib/

其中我們使用到了MD5中數據加密函數

void MD5Str(char *input, unsigned char *output);
參數: input:要加密的數據
      output:加密後的數據

程序mysqlite3.c如下:

技術分享圖片
  1 #include <sqlite3.h>
  2 #include <stdio.h>
  3 #include <string.h>
  4 #include "md5.h"
  5 
  6 /*定義此宏時使用回調函數查詢否則只是用非回調函數查詢*/
  7 //#define CALLBACK 
  8 
  9 /*定義創建表格指令IF not EXISTS:不存在,AUTOINCREMENT:自動增加主鍵,not NULL:不能為空
*/ 10 #define CREATE "create table IF not EXISTS passwd(id integer primary key AUTOINCREMENT,username text not NULL,password text not NULL)" 11 /*定義查詢數據指令*/ 12 #define SELECT "select * from passwd where username=‘%s‘ and password=‘%s‘" 13 /*定義插入數據指令*/ 14 #define INSERT "insert into passwd(username,password) values(‘%s‘,‘%s‘)" 15
16 /*如果查詢到多行數據, 那麽這個函數就會調用多次(每一行調用一次)*/ 17 int callback(void *arg, int col, char **value, char **name) 18 { 19 int i=0; 20 for(i=0;i<col; i++) 21 { 22 printf("%s\t", value[i]); 23 } 24 printf("\n"); 25 return 0; 26 } 27 28 29 int main(void) 30 { 31 32 //1.打開數據庫 33 sqlite3 *ppdb = NULL; 34 int ret = sqlite3_open("./passwd", &ppdb); /*我們之前要先創建一個名字叫passwd的數據庫*/ 35 if(ret != SQLITE_OK) 36 { 37 perror("open fail"); 38 return -1; 39 } 40 sqlite3_exec(ppdb,CREATE,NULL,NULL,NULL); /*創建一個表格*/ 41 char temp[32]; 42 char temp1[32]; 43 char insert[strlen(temp)+strlen(temp1)+200]; /*這裏的數組要給大一點,因為等下加密的時候會得到一串很長的數據*/ 44 printf("please input your username:"); 45 scanf("%s",temp); 46 printf("please input your password:"); 47 scanf("%s",temp1); 48 MD5Str(temp1,temp1);/*把輸入的密碼使用md5加密存儲在數據庫表格中*/ 49 printf("1111\n"); 50 51 52 sprintf(insert,INSERT,temp,temp1);/*打包數據,準備插入到表格中*/ 53 54 sqlite3_exec(ppdb,insert,NULL,NULL,NULL); 55 56 57 char username[32]; 58 char password[33]; 59 printf("input username:"); 60 scanf("%s",username); 61 printf("input password:"); 62 scanf("%s",password); 63 64 MD5Str(password,password);/*把輸入的密碼使用md5加密之後與數據庫表格中的密碼匹對*/ 65 char sql[strlen(SELECT)+strlen(username)+strlen(password)]; 66 67 /*打包一個字符串,將SELECT字符串放到sql中,username和password這兩個變量放大SELECT中*/ 68 sprintf(sql,SELECT,username,password); 69 70 71 #ifdef CALLBACK 72 //回調查詢 73 char *selectsql = "select * from myname"; 74 ret = sqlite3_exec(ppdb, selectsql, callback, NULL, NULL); 75 if(ret != SQLITE_OK) 76 { 77 perror("create fail"); 78 sqlite3_close(ppdb); 79 return -1; 80 } 81 82 //非回調查詢 83 #else 84 char **result = NULL; 85 int row = 0; 86 int col = 0; 87 char *error = NULL; 88 ret = sqlite3_get_table(ppdb,sql,&result,&row,&col,&error); 89 if(ret != SQLITE_OK) 90 { 91 perror("get table fail"); 92 return -1; 93 } 94 95 int i=0, j=0; 96 for(i=0;i<row+1;i++) 97 { 98 for(j=0;j<col;j++) 99 { 100 printf("%s\t",result[j+i*col]); 101 } 102 printf("\n"); 103 } 104 105 if(row > 0) /*數據匹配成功*/ 106 printf("checked OK\n"); 107 else /*數據匹配失敗*/ 108 printf("fail\n"); 109 sqlite3_free_table(result);//釋放結果 110 #endif 111 112 113 sqlite3_close(ppdb); 114 return 0; 115 }
View Code

我們先要創建一個名字叫passwd數據庫,如果不懂創建可以看看我的這篇文章:linux數據庫環境搭建

sqlite3 passwd

接著我們編譯程序

gcc -o mysqlite3 mysqlite3.c -lsqlite3 -lmd5

 

運行結果如下:

技術分享圖片

linux數據庫中使用MD5加密