Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2321|回复: 0
打印 上一主题 下一主题

sqlite存储加密

[复制链接]

388

主题

602

帖子

2218

积分

金牌会员

Rank: 6Rank: 6

积分
2218
跳转到指定楼层
楼主
发表于 2016-3-27 21:55:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
global-messages-db.sqlite  文件用NotePad 打开,以UTF-8编码查看,可见中文名文。

编译sqlite模块,先编译mozilla/db/sqlite3/src,再编译mozilla/storage/。sqlite数据文件生成后,不可中途再修改加密开关。

http://blog.51cto.com/zt/326/    SQLite 3.7.13 加密解密


sqlite数据库加密方案
针对sqlite数据库文件,进行加密。现有两种方案如下
1.对数据库中的数据进行加密。
2.对数据库文件进行加密
两种加密方式的优缺点,比较如下:

一、对数据库中的数据进行加密
优点:
1.实现数据加密快速,只需添加两个方法
一是:对明文数据进行加密返回密文数据
二是:对密文数据进行解密返回明文数据

2.程序无需进行太大变动,仅在对数据进行
添加,修改,删除,查询时。针对指定的表字段
进行修改进行加密,解密的字段即可。

不足:
1.由于对数据进行了加密。所以为了看到明文,必须密文进行解密。
因此会增加处理器的消耗。因终端手机的处理能力有限,可能会出现
处理数据缓慢的现象发生。

2.仅仅对数据进行了加密,还是可以看到数据表的sql语句,
可能猜测到表的作用。另外,如果没有对一个表中的所有字段加密,
则可以看没有加密的明文数据。


需要做的工作:
1.无需考虑平台差异性,qt,android,ios都能快速
的实现。只需在每个平台上,使用各自的语言,实现
同样的加密,解密算法即可。

2.需要对加密算法进行了解,选择一种加密算法,进行实现。

二、对数据库文件进行加密
优点:
1.对整个文件进行了加密,用户通过编辑器看不到任何有用的数据,
用户使用sqlite browser软件也无法打开文件查看数据,保证了数据安全。

2.进行打开数据库时,使用程序sqlite3_key(db,"********",8);
即可对文件解密,对数据表的操作无需进行加密,采用明文即可。

不足:
1.需要修改sqlite的源代码,这个工作难度比较大。
2.需要对修改后的sqlite进行编译,需要对makefile有所了解,
手动编写makefile文件,对源程序进行编译。因平台差异性,可能会造成
某个平台无法编译生成动态链接库的可能。
3.需要对数据访问层代码进行修改,例如qt平台需要将以前对数据库操作使用的
QSqlQuery类,更改为使用sqlite3.h文件中定义操作,对数据库操作。
其他平台也一样,都要做这一步的修改。
4.在程序编译时,要加入使用加密的动态链接库(linux为共享库.so文件)
windows平台最容易,只需将所使用的dll文件copy到应用程序中即可。
其他平台需要实验,看如何引入库,如果编译。

需要做的工作:
1.修改sqlite源代码,追加对数据库文件进行加密的功能。
2.编译含有加密功能的程序源代码,生成各自平台需要使用的库文件。
3.将加密sqlite库文件引入各自平台中,修改数据库访问层代码。
4.进行程序的部署,测试。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
加密算法的相关知识:
加密技术通常分为两大类:“对称式”和“非对称式”。
  对称式加密就是加密和解密使用同一个密钥,通常称之为“Session Key ”这种加密技术目前被广泛采用,如美国政府所采用的DES加密标准就是一种典型的“对称式”加密法,它的Session Key长度为56Bits。
  非对称式加密就是加密和解密所使用的不是同一个密钥,通常有两个密钥,称为“公钥”和“私钥”,它们两个必需配对使用,否则不能打开加密文件。这里的“公钥”是指可以对外公布的,“私钥”则不能,只能由持有人一个人知道。它的优越性就在这里,因为对称式的加密方法如果是在网络上传输加密文件就很难把密钥告诉对方,不管用什么方法都有可能被别窃听到。而非对称式的加密方法有两个密钥,且其中的“公钥”是可以公开的,也就不怕别人知道,收件人解密时只要用自己的私钥即可以,这样就很好地避免了密钥的传输安全性问题。

常见加密算法
  DES(Data Encryption Standard):对称算法,数据加密标准,速度较快,适用于加密大量数据的场合;
  3DES(Triple DES):是基于DES的对称算法,对一块数据用三个不同的密钥进行三次加密,强度更高;
  RC2和 RC4:对称算法,用变长密钥对大量数据进行加密,比 DES 快;
  IDEA(International Data Encryption Algorithm)国际数据加密算法,使用 128 位密钥提供非常强的安全性;
  RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的,非对称算法;
  DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准),严格来说不算加密算法;
  AES(Advanced Encryption Standard):高级加密标准,对称算法,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法;
  BLOWFISH,它使用变长的密钥,长度可达448位,运行速度很快;
  MD5:严格来说不算加密算法,只能说是摘要算法
  对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
  在MD5算法中,首先需要对信息进行填充,使其字节长度对512求余的结果等于448。因此,信息的字节长度(Bits Length)将被扩展至N*512+448,即N*64+56个字节(Bytes),N为一个正整数。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,现在的信息字节长度=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。(可参见MD5算法词条)
  SSF33,SSF28,SCB2(SM1):国家密码局的隐蔽不公开的商用算法,在国内民用和商用的,除这些都不容许使用外,其他的都可以使用;

先不用管上面的编译错误,创建crypt.c和crypt.h,用来实现加密解密函数和相应接口的定义。

crypt.c里实现了加密解密函数,代码如下:

#include "crypt.h"
#include "memory.h"

/***********
关键加密函数
***********/
int My_Encrypt_Func(unsigned char * pData, unsigned int data_len,
              unsigned char * key, unsigned int len_of_key)

{
       unsigned int i;
       unsigned char bit, val;

       for (i = 0; i < data_len; i++)
       {
              val = ~(*pData);
              *pData = val;
              pData++;
       }
       return 0;
}

/***********
关键解密函数
***********/
int My_DeEncrypt_Func(unsigned char * pData, unsigned int data_len,
              unsigned char * key, unsigned int len_of_key)

{
       unsigned int i;
       unsigned char bit, val;

       for (i = 0; i < data_len; i++)
       {
              val = ~(*pData);
              *pData = val;
              pData++;
       }
       return 0;
}

这里加密解密函数就是简单的采用了求反的操作,目的是用来演示加密和解密。以后实际运用中把这两个函数内的算法修改为自己的加密解密算法即可。

注意:这里的加密解密函数实际上没有用到Key值,因此加密后使用任意Key值均可以解开数据库,但是加密后,用第三方工具是不能直接打开的。


crypt.h用来声明加密解密函数的定义,以便sqlite3.c包含加密解密接口,代码如下:

/**
* 加密函数
*/
int My_Encrypt_Func(unsigned char * pData, unsigned int data_len,
              unsigned char * key, unsigned int len_of_key);

/**
* 解密函数
*/
int My_DeEncrypt_Func(unsigned char * pData, unsigned int data_len,
              unsigned char * key, unsigned int len_of_key);

注意:网上的代码中,参数key定义为“const char *”类型,与sqlite3.c代码一起编译时会有错误,这里按照sqlite3.c中的类型修改为“unsigned char *”类型。


sqlite的数据库加密直接调用上面的函数,简单的对数据进行 求反  操作

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-11-26 09:38 , Processed in 0.057087 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表