Andy Niu �����ĵ�

Andy Niu

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_PF???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.