SQLite 的实践学习(1) --- 加入AES和MD5加密

       SQLite具有诸多的优点,如零配置、移植性、紧凑性、简单性、灵活性、自由授权、可靠性和易用性等。它的各种特点使它非常适合做一些中小型项目的 DBMS,或构建Cache,或嵌入式项目的DBMS。

      最近在学习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

          定义该宏之后,重新编译代码,发现现在编译不通过了,提示有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)

      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;

          使用MD5的原因是:AES密钥的长度为16字节,如果用户设置的密码长度不够或者过长,就需要一定的转换(补位、裁剪、变换等),由于MD5是输入不定长度信息,输出也是固定长度为16字节,所以直接使用它。

 

          vs2010编译源代码下载。  

 

          感谢: 

                董淳光之SQLITE3 使用总结 

                PolarSSL 

转载于:https://www.cnblogs.com/pennant/archive/2012/10/11/2716134.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值