文章目录

  • 一、前提
  • 二、步骤
    • 1.JAVA平台
    • 2. PHP平台
      • 2.1 编译
      • 2.2 开启php的sqlite3扩展
      • 2.3.PHP使用加密数据库
  • 二、最后

一、前提

环境:
Ubuntu服务器,已经默认安装了apache2和php7,账号具备sudo权限。
问题:

    1. 本地数据从JAVA平台导出,同时考虑易用和数据安全,采用Sqlite3数据库并基于Sqlcipher v4方式加密;
    1. 需要在这台服务器上搭建一个php简易网站,并从本地读取数据用于显示;

故需要在服务器上开启php sqlite3扩展支持,并且支持能够和JAVA平台兼容的如上加密方式。

二、步骤

首先是查询Sqlcipher相关信息,发现这玩意虽然是开源的,但是对于多平台都是企业支持,包括SQLCipher for JDBC,对于PHP的支持,stack overflow上推荐的官网教程页面也打不开,可能已经被移除了。

1.JAVA平台

于是查询采用其他开源方案,JDBC使用sqlite-jdbc-encrypt,可以在github上下载最新的jar并导入java工程,该包支持对多种sqlite3的多种加密方式,其中包括Sqlcipher,具体信息可以查询其github主页说明,在java平台的代码示例如下:

// 采用URI方式配置数据库
// 指定加密方式为sqlcipher, 版本v4,key后面为数据库密码
private static final String SQL_URL = "jdbc:sqlite:file:mydata.db?cipher=sqlcipher&legacy=4&key=mykey";private static Connection mConn = null;// 打开数据库
public static boolean open() {System.out.println("open...");if (mConn != null) return true;try{mConn = DriverManager.getConnection(SQL_URL);} catch (SQLException e) {e.printStackTrace();}return mConn != null;
}// 使用数据库,和sqlite3方式一致
public static void viewData() {System.out.println("viewData...");try (Statement st = mConn.createStatement()) {ResultSet rs = st.executeQuery("SELECT * FROM mytable;");int columnCount = rs.getMetaData().getColumnCount();while (rs.next()) {for (int i=0; i<columnCount ; ++i) {System.out.print(rs.getString(i));}System.out.println();}} catch (SQLException e) {e.printStackTrace();}
}// 关闭数据库
public static void close() {System.out.println("close...");try {if (mConn != null && !mConn.isClosed()) mConn.close();} catch (SQLException e) {e.printStackTrace();}mConn = null;
}

2. PHP平台

PHP平台支持sqlite3加密确实比较麻烦,全网上也没搜到啥完整的教程,根据查到各种信息一步一步自己摸索。

2.1 编译

首先是编译带加密的sqlite3扩展库,先去官网上下载对应版本的PHP源码,在Ubuntu上输入php -v可以看到版本号,这里是PHP7.0.33

进入PHP官网-Download页面,点击进入右侧的Old archives页面,在这个页面下搜对应版本,选择喜欢的格式下载源码,之后在Ubuntu下解压备用;

然后就是下载加密扩展的源码,一开始是打算下载sqlcipher源码,奈何官网教程打不开,于是转向另一个开源的wxSqlite3项目,在Release中选择版本(最好选择与PHP版本兼容的sqlite3版本,可以在php源码ext/sqlite3/libsqlite/sqlite3.c中查看),这里下载的是wxsqlite3-4.5.1,下载源码在Ubuntu下解压备用;

从wxSQLite3 4.6.0(sqlite3.32.0)版本开始,加密扩展已经作为独立源码移到另外一个SQLite3MultipleCiphers项目,src下的代码对应wxsqlite3的sqlite3secure/src下的代码

然后进入编译阶段,先把wxsqlite3源码的sqlite3secure/src下的代码复制覆盖到php源码的ext/sqlite3/libsqlite/sqlite3.c目录,然后cd到php源码的"ext/sqlite3/"目录下依次执行(SQLite3MultipleCiphers源码CFLAG配置参考对应的官方文档):

$ ./configure CFLAGS="-DSQLITE_HAS_CODEC -DCODEC_TYPE=WXSQLITE3_USE_SQLCIPHER_LEGACY -DWXSQLITE3_USE_SQLCIPHER_LEGACY=4"$ phpize$ make && sudo make install

成功后,可以看到类似如下信息:

Installing shared extensions:     /usr/lib/php/20151012/
Installing header files:          /usr/include/php/20151012/
2.2 开启php的sqlite3扩展

进入到/etc/php/7.0/apache2/conf.d目录,执行ls -al,可以看到这里以链接方式包含所有从apache2方式启动php的扩展配置文件:

...
20-ftp.ini -> /etc/php/7.0/mods-available/ftp.ini
20-gettext.ini -> /etc/php/7.0/mods-available/gettext.ini
20-iconv.ini -> /etc/php/7.0/mods-available/iconv.ini
20-json.ini -> /etc/php/7.0/mods-available/json.ini
20-phar.ini -> /etc/php/7.0/mods-available/phar.ini
20-posix.ini -> /etc/php/7.0/mods-available/posix.ini
20-readline.ini -> /etc/php/7.0/mods-available/readline.ini
20-shmop.ini -> /etc/php/7.0/mods-available/shmop.ini
20-simplexml.ini -> /etc/php/7.0/mods-available/simplexml.ini
20-sockets.ini -> /etc/php/7.0/mods-available/sockets.ini
...

参考已有的配置文件格式,配置sqlite3扩展:

  • a) 使用vi创建一个sqlite3配置文件
    sudo vi /etc/php/7.0/mods-available/sqlite3.ini

  • b) 在vi界面按Inert键启动编辑,写入内容
    extension=sqlite3.so

  • c) 按Esc退出编辑,同时按Shift+:键,输入wq保存文件

  • d)在当前/etc/php/7.0/apache2/conf.d目录下创建链接
    sudo ln -s /etc/php/7.0/mods-available/sqlite3.ini 20-sqlite3.ini

  • e) 重启apache2服务使配置生效
    sudo service apache2 restart

如果需要同时开启php调试信息显示,可以在步骤d之后,编辑/etc/php/7.0/apache2/php.ini文件,将其中的display_errors = Off改为display_errors = On,然后执行步骤e重启服务生效

2.3.PHP使用加密数据库

最后就是在PHP平台上操作加密数据库。虽然编译生成的sqlite3扩展库已经支持加密了,但是php对其依然只能使用默认sqlite3支持的操作接口,无法通过wxsqlite3特定的接口实现加密配置和操作。

关于这一步也没有搜到相关的信息,除了这篇《利用wxsqlite3实现php-sqlite3加密扩展》的博客涉及到windows平台的编译和针对php平台添加额外的加密接口,其他的基本都是人云亦云;

最后在下载的wxsqlite3-4.5.1源码下的sqlite3secure/readme.md中找到相关的信息(github文档,SQLite3MultipleCiphers源码参考对应的官方文档),可以采用SQL语句的方式调用对应的接口实现加密配置和操作,具体php代码参考如下:

    // open or create a database file$db=new SQLite3("mydata.db");# set default cipher to sqlcipher$result = $db->query("SELECT wxsqlite3_config('default:cipher', 'sqlcipher');");var_dump($result->fetchArray(SQLITE3_ASSOC));# set sqlcipher legacy to v4$result = $db->query("SELECT wxsqlite3_config('sqlcipher', 'legacy', 4);");var_dump($result->fetchArray(SQLITE3_ASSOC));# set password, Note: Must use exec()$result = $db->exec("PRAGMA key='mykey'");var_dump($result);// create mytable$result = $db->exec("create table mytable (name varchar(200));");var_dump($result);// insert data$db->exec("insert into mytable  (name) values ('xxxxxx')");// query data$result = $db->query('SELECT * FROM mytable;');while($row = $result->fetchArray(SQLITE3_ASSOC)) {var_dump($row);}// close database$db->close();

实测在PHP下使用该方法的配置和操作,可以和JAVA平台通过sqlite-jdbc-encrypt配置和操作的本地Sqlite3数据库完美兼容,至此问题解决。

二、最后

由于在Ubuntu基于PHP中扩展使用加密的sqlite3的资料实在甚少,官方社区对涉及三方库的问题支持也比较模糊,故有此文作为记录和参考,有需要的朋友也可参考。

在Ubuntu PHP中基于wxsqlite3扩展使用加密的Sqlite数据库相关推荐

  1. 在C#中,如何连接已加密的Sqlite数据库

    对数据加密分两种,一种是对数据库本身进行加密,另一种是对数据表中的数据进行加密, 如果SQLite数据库加密,我这里使用的一个管理工具叫SQLiteDeveloper,如下就可以加密数据库 , 如果在 ...

  2. ubuntu虚拟机中的vscode:扩展失败XHR Failed

    在B站跟随左哥学习Linux嵌入式开发过程中,遇到了如下问题:在Ubuntu虚拟机中安装VS code后,需要安装合适的插件.此时,vscode出现扩展失败XHR Failed ,如图所示: 并且在V ...

  3. 项目实战——基于Java8+JavaFX+多线程+文件IO+SQLite数据库实现的本地文件快速搜索引擎详细设计实现

    目录 一.前言介绍 二.功能展示 2.1选择所要查找的文件夹 2.2将所选目录下的所有文件进行属性展示 2.3支持搜索框查询文件(模糊查询) 2.4统计本次扫描信息 ​编辑 三.整体设计 3.1工具类 ...

  4. android 图片存储读取数据库中,如何在android中存储(位图图像​​)并从sqlite数据库中检索图像?...

    设置数据库public class DatabaseHelper extends SQLiteOpenHelper { // Database Version private static final ...

  5. 夜神模拟器链接eclipse并导出模拟器中app的db文件,查看sqlite数据库过程

    网上试过的方法,归纳总结备用 第一步,启动夜神模拟器的开发者选项,类似华为手机功能 进入屏幕上的[设置],如图 2,进入[关于平板电脑],如图 3,点击5次[版本号] 4,退回到[设置]目录,会看到[ ...

  6. python读取数据库文件的扩展名_Python读取sqlite数据库文件的方法分析

    本文实例讲述了Python读取sqlite数据库文件的方法.分享给大家供大家参考,具体如下: 这是Python内置的,不需要pip install 包 数据库里面有很多张表 要操作数据库首先要连接co ...

  7. android中保存多行数据,Android使用SQLite数据库存数数据

    Android使用SQLite数据库存数数据 前面我们介绍了用 SharedPreferences 和文件存储信息的方法,但是当频繁大量地使用数据存储时,就要用到数据库来管理信息数据. 在 Andro ...

  8. FISCO BCOS 生态中的数字身份组件 WeIdentity 用 Sqlite 存储 WeId | Rust 学习

    1 什么是 数字身份标识与数字身份体系? 首先,让我们来看下什么是分布式数字身份标识(DID): 分布式数字标识符(DID)是一种新型标识符,用以标识可验证的分布式的数字身份. DID的控制者决定标识 ...

  9. idea中链接mysql查询_在Idea中编写Java程序连接查询Sqlite数据库

    1.使用SqliteSpy建立好数据库文件SqliteSpy运行界面 2.准备好一个空文件夹存放java工程和数据库文件,准备好数据库驱动jar包拷贝到文件夹中sqlite数据库文件和驱动 3.在Id ...

最新文章

  1. Hdu 1283 钱币兑换问题
  2. Java中的字符串驻留
  3. Exchange与ADFS单点登录 PART 3:部署和配置WAP
  4. Java多线程系列(一):最全面的Java多线程学习概述
  5. c3p0 服务启动获取连接超时_微服务架构中的熔断、降级
  6. react 改变css样式_web前端入门到实战:编写CSS代码的8个策略,资深开发工程师总结...
  7. python 相关系数函数会产生无穷大吗_python 求相关系数
  8. 【linux系统编程】基础开发工具:gcc/g++
  9. Windows网络服务---DHCP服务
  10. ENVI5.3.1使用Landsat 8影像进行预处理及分析实例操作
  11. 破解钉钉旧版本强制更新(实现旧版本登录)
  12. Postgresql管理系列-第三章Query Processing(下半部分-join operation介绍)
  13. 国产数据库-达梦数据库安装
  14. linux怎么移植安卓rom,【经验技巧】任意手机移植ROM 教程,超详细ROM 技术详细......
  15. Localizing oscillatory sources using beamformer techniques:part 1
  16. 第一届世界区块链大会·三点钟峰会(W.B.C)在澳门开幕 万人峰会大咖云集明星嘉年华
  17. 【微信小程序】NodeJs调用云开发HTTP API错误代码47001 / data format error错误
  18. 必学的Linux指令
  19. 对计算机会计上机课的心得,浅谈高职会计电算化实训课程|会计电算化心得2000字...
  20. 请帮忙写一个虫洞坍塌计算公式

热门文章

  1. 在线文档协作进行项目管理
  2. 网络攻击肆虐-给你的网络设备来套防弹衣吧!
  3. XML 架构示例(微软文档)
  4. C语言错误 error C2059
  5. linux最大文件名,linux和windows文件名长度限制
  6. 巴菲特在University of Florida商学院的一次演讲
  7. Visitor(访问者模式)
  8. 如何做一个“实用”的图像数据集
  9. opencv中imread函数的使用
  10. 国产步进电机驱动芯片TMI8420,可pin to pin​替代DRV8825