|
Andy Niu Help
1.0.0.0
|
模块 | |
| CryptDB流程 | |
变量 | |
| DBMeta写入到embedded_db | |
| 对于HOM反序列化,再序列化之后发生变化,为什么 | |
| 运行环境有关 | |
| CryptDB原理介绍 | |
| QA常见问题解答 | |
| 出现问题,怎么恢复 | |
| 查看嵌入数据库embedded_db | |
| blowfish的秘钥key哪里来的 | |
详细描述
变量说明
| blowfish的秘钥key哪里来的 |
1、proxy启动后,第一次tlogin的时候
bf(cinteger.getKey())
const CryptedInteger cint = CryptedInteger::deserialize(serial);
DBMeta::doFetchChildren 读取出来的,执行下面的语句
" SELECT embedded_db.generic_prefix_MetaObject.serial_object, embedded_db.generic_prefix_MetaObject.serial_key, embedded_db.generic_prefix_MetaObject.id FROM embedded_db.generic_prefix_MetaObject WHERE embedded_db.generic_prefix_MetaObject.parent_id = 4;"
2、得到三条记录,如下:
67 DETJOIN DETJOIN_int 16_PF???g?鈳r?9_MYSQL_TYPE_LONGLONG1_020_18446744073709551615 | 1_0 | 5 |
67 DET DET_int 16_+DoL8;颜*+攝擪19_MYSQL_TYPE_LONGLONG1_020_18446744073709551615 | 1_1 | 6 |
67 RND RND_int 16_紅Q╠6z柎?19_MYSQL_TYPE_LONGLONG1_020_18446744073709551615 | 1_2 | 7 |
分别是child_serial_object,child_key,child_id
3、其中的child_serial_object,67 RND RND_int 16_紅Q╠6z柎?19_MYSQL_TYPE_LONGLONG1_020_18446744073709551615
构建出来 const CryptedInteger cint = CryptedInteger::deserialize(serial);
得到
struct SerialLayer
{
SECLEVEL l; SECLEVEL::RND
std::string name; RND_int
std::string layer_info; 16_紅Q╠6z柎?19_MYSQL_TYPE_LONGLONG1_020_18446744073709551615
};
4、再看create table的时候,怎么构建出来的?
bool CreateDelta::apply 构建出来秘钥,然后insert一下
" INSERT INTO embedded_db.generic_prefix_BleedingMetaObject (serial_object, serial_key, parent_id, id) VALUES ( '16_table_DLMEMQPBCJ4_TRUE4_TRUE20_tableSalt_WQTBEQVBGY1_1', '2_t2', 1, 0);"
" INSERT INTO embedded_db.generic_prefix_BleedingMetaObject (serial_object, serial_key, parent_id, id) VALUES ( '67 DETJOIN DETJOIN_int 16_P\377F\315>\217\035?g\340;\342\216r\024\370\061\071_MYSQL_TYPE_LONGLONG1_020_18446744073709551615', '1_0', 15, 0);"
5、serial_object是怎么来的?
child_serial "67 RND RND_int 16_+\310\356$\245\270\337\021\321;J\"4*\247\030\061\071_MYSQL_TYPE_LONGLONG1_020_18446744073709551615"
esc_child_serial "67 RND RND_int 16_+\310\356$\245\270\337\021\321;J\\\"4*\247\030\061\071_MYSQL_TYPE_LONGLONG1_020_18446744073709551615"
esc_child_serial是对双引号转义一下
6、child_serial怎么来的?
const std::string &child_serial = object.serialize(parent);
7、找到不同的加密方法
std::string OnionMeta::serialize(const DBObject &parent) const
{
const std::string &serial =
serialize_string(this->onionname) +
serialize_string(std::to_string(this->uniq_count)) +
serialize_string(TypeText<SECLEVEL>::toText(this->minimum_seclevel));
return serial;
}
| CryptDB原理介绍 |
1、Client<--->Proxy<--->Mysql
2、站在Client的角度,是和Mysql交互,不需要了解后面的机制。
3、站在Mysql的角度,内部存储的是加密信息,但是要支持同态运算。
4、这些工作,都是Proxy做的处理,接收客户端的正常sql请求,经过处理,关键信息加密,发给Mysql,
特别注意,发给Mysql的信息,还必须要符合sql语法,只不过关键信息加密了。
| DBMeta写入到embedded_db |
1、这里分为两个阶段,
第一个阶段写入到 generic_prefix_BleedingMetaObject
第二个阶段写入到 generic_prefix_MetaObject
2、需要保证这两个表的数据保持一致?
先考虑 generic_prefix_BleedingMetaObject,是个树形结构,通过parent_id 和 id 体现父子关系
id是主键,并且自增,每次insert的时候,id的value写成0,mysql会自行计算这个值如何自增,并写成自增的的值。
注意:如果不是写成0,比如当前的值为200,id的value写成300,那么以后从300开始自增。
3、因为要保持一致,所以要保存起来id,后面写入到 generic_prefix_MetaObject
| QA常见问题解答 |
1、一个字段为什么分成多个字段?
不能支持全同态加密,需要分成多个字段,支持不同模式的同态加密。
2、同态加密的字段为什么要多次加密?
同态加密字段按道理加密一次就够了,但是这样不够安全。因为同态加密算法,往往是相同的明文加密得到相同的密文。
因此,增加一次RND,对同态加密的结果再执行一个加盐。需要保存盐值,用于解密。
| 出现问题,怎么恢复 |
1、删除mysql中的数据库cryptdb_udf、remote_db和yytest 2、删除 /home/niuzibin/work/heming/cryptdb/shadow目录中的文件全部删除
| 对于HOM反序列化,再序列化之后发生变化,为什么 |
1、MjcgSE9NIEhPTSAxNiBIT00gSE9NIAko13oqF7NHoGBJCTcuj4M=
base64解码后为 27 HOM HOM 16_XXX
2、然后构建HOM,如下:
return std::unique_ptr<EncLayer>(new HOM(id, serial));
这里存在一个问题,把整个 27 HOM HOM 16_XXX 作为seed_key,实际上应该是 16_XXX 作为seed_key
3、再次序列化的时候,前面一些固定的参数,加上seed_key,如下:
38 HOM HOM 27 HOM HOM 16_XXX
4、然后base64编码为
MzggSE9NIEhPTSAyNyBIT00gSE9NIDE2IEhPTSBIT00gCSjXeioXs0egYEkJNy6Pgw==
导致发生了变化
5、怎么解决这个问题?
就是再构建HOM的时候,使用16_XXX作为seed_key
6、这里引申出一个问题,HOM是同态加法,如果秘钥发生了变化,就没法支持同态加法。
那么原来写入数据库的时候,为什么没有问题?
因为数据库只写入一次HOM的这条记录,以后都是读取。
但是对于文件,涉及到读取,写入,重启又涉及到读取,写入。
| 查看嵌入数据库embedded_db |
1、准备工作
mysql> create database yytest;
Query OK, 1 row affected (0.01 sec)
mysql> use yytest;
Database changed
mysql>
mysql>
mysql> create table t1(c1 int);
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;+------------------+
| Tables_in_yytest |
+------------------+
| t1 |
+------------------+
1 row in set (0.00 sec)
mysql> insert into t1(c1) value(100);
Query OK, 1 row affected (0.02 sec)
2、在shadow目录会多出来一些文件,如下:
niuzibin@ubuntu:~/work/heming/cryptdb/shadow$ ll
total 28688
drwxrwxr-x 4 niuzibin niuzibin 4096 Apr 9 23:35 ./
drwxrwxr-x 15 niuzibin niuzibin 4096 Apr 3 22:45 ../
drwx------ 2 niuzibin niuzibin 4096 Apr 9 23:29 embedded_db/
-rw-rw---- 1 niuzibin niuzibin 18874368 Apr 9 23:36 ibdata1
-rw-rw---- 1 niuzibin niuzibin 5242880 Apr 9 23:36 ib_logfile0
-rw-rw---- 1 niuzibin niuzibin 5242880 Apr 9 23:29 ib_logfile1
drwx------ 2 niuzibin niuzibin 4096 Apr 9 23:36 yytest/
3、关闭mysql和proxy
4、拷贝文件,到另一个mysql
注意:不要拷贝到当前的这个mysql,否则会影响yytest
sudo scp -r ./* [email protected]:~/aaa
5、再到目标mysql,拷贝一下,修改所有者
cp /home/niuzibin/aaa/* ./ -r
root@ubuntu:/var/lib/mysql# chown mysql ./ -R
6、重新启动mysql,然后连接mysql测试一把
还有另外一种办法:
1、set @cryptdb="show";
2、修改代码,如下:
/*const std::string &query =
"SELECT * FROM " + MetaData::Table::showDirective() + ";"; */
std::string query =
"SELECT * FROM " + MetaData::Table::showDirective() + ";";
设置query可以修改
3、打上断点,修改查询语句
"select * from generic_prefix_BleedingMetaObject;"
"select * from generic_prefix_MetaObject;"
"select * from generic_prefix_embeddedQueryCompletion;"
"select * from generic_prefix_showDirective;"
"select * from generic_prefix_staleness;"
| 运行环境有关 |
1、启动
/home/niuzibin/work/cryptdb/bins/proxy-bin/bin/mysql-proxy --plugins=proxy --event-threads=4 --max-open-files=1024 --proxy-lua-script=$EDBDIR/mysqlproxy/wrapper.lua --proxy-address=0.0.0.0:3307 --proxy-backend-addresses=localhost:3306
export EDBDIR=/home/niuzibin/work/cryptdb
2、连接
mysql -uroot -pletmein -h127.0.0.1 -P3307
3、环境创建
create database yytest;
create table student(id int, age int, name varchar(64));
insert into student value(1,18,"Andy");
insert into student value(2,17,"Bill");
create table teacher(id int, age int, name varchar(64));
insert into teacher value(1,18,"T_Andy");
insert into teacher value(2,17,"T_Bill");
Copyright (c) 2015~2016, Andy Niu @All rights reserved. By Andy Niu Edit.