最近在學習SQLite的使用,為了讓學習更有效,在實踐中學習,所以制定以下任務,一邊做一邊學:
1) 在SQLite的普通版本上加入加密功能(SQLite預留的加密接口,只是需要另外去完成)。
2) 把加密版本編譯一個.Net的版本。
3) 通過NDK的方式把加密版本的SQLite加入到Android。
不要浪費時間,現在就做第一個任務,加密
正如上面所說的,SQLite的作者早就考慮到以后數據加密的需求,所以預留了加密接口,我們只需要完成這些接口,就可以讓它保存的數據變成密文。在說怎么加入加密功能之前,先簡單說一下SQLite的文件。它非常簡單和緊湊,只有 sqlite3.h 和 sqlite3.c 兩個文件,.h文件定義了一些宏和全部接口,.c文件就是接口實現,我們主要修改.c文件的實現。
1)要打開加密功能,需要定義一個宏。
#ifndef SQLITE_HAS_CODEC
# define SQLITE_HAS_CODEC
#endif
# define SQLITE_HAS_CODEC
#endif
定義該宏之后,重新編譯代碼,發現現在編譯不通過了,提示有5個函數並沒有實現,它們分別是:
int sqlite3CodecAttach(sqlite3 * db,
int nDB,
const void * pKey,
int nKeyLen)
void sqlite3CodecGetKey(sqlite3 * db, int nDB, void ** Key, int * nKey)
int sqlite3_key(sqlite3 * db, const void * pKey, int nKey)
int sqlite3_rekey(sqlite3 * db, const void * pKey, int nKey)
void sqlite3_activate_see( const char * right)
void sqlite3CodecGetKey(sqlite3 * db, int nDB, void ** Key, int * nKey)
int sqlite3_key(sqlite3 * db, const void * pKey, int nKey)
int sqlite3_rekey(sqlite3 * db, const void * pKey, int nKey)
void sqlite3_activate_see( const char * right)
2)代碼的實現通過網上找的,不過在加密方面更改為密鑰生成方面使用MD5,數據加解密使用AES 256。
unsigned char* DeriveKey(
const
void* pKey,
int nKeyLen)
{
unsigned char* hKey = NULL;
if (pKey == NULL || nKeyLen == 0)
{
return NULL;
}
hKey = ( unsigned char*)sqlite3_malloc(DB_KEY_LENGTH_BYTE + 1);
if (hKey == NULL)
{
return NULL;
}
hKey[DB_KEY_LENGTH_BYTE] == 0;
md5(( const unsigned char*)pKey, nKeyLen, hKey);
return hKey;
}
{
unsigned char* hKey = NULL;
if (pKey == NULL || nKeyLen == 0)
{
return NULL;
}
hKey = ( unsigned char*)sqlite3_malloc(DB_KEY_LENGTH_BYTE + 1);
if (hKey == NULL)
{
return NULL;
}
hKey[DB_KEY_LENGTH_BYTE] == 0;
md5(( const unsigned char*)pKey, nKeyLen, hKey);
return hKey;
}
使用MD5的原因是:AES密鑰的長度為16字節,如果用戶設置的密碼長度不夠或者過長,就需要一定的轉換(補位、裁剪、變換等),由於MD5是輸入不定長度信息,輸出也是固定長度為16字節,所以直接使用它。
vs2010編譯源代碼下載。
感謝: