PHP编译支持SQLite3加密扩展

自PHP 5.3.0起默认启用SQLite3扩展,但是由于SQLite 3 开源版不带加密功能,如果想使用加密功能需要用他的商业版本。这导致PHP默认的SQLite扩展本身是不支持加密功能,只预留了相关的接口,详见官方文档介绍:

An optional encryption key used when encrypting and decrypting an
SQLite database. If the SQLite encryption module is not installed,
this parameter will have no effect.

但是如果项目需要用到SQLite,如果不加密,对安全多多少少有一点影响。还好SQLite本身有预留加密的接口,许多爱好者就基于这个接口,实现了加密功能。

目前比较有知名度的分别是:wxsqlite3和sqlcipher,其中sqlcipher官方有文档介绍如何实现php的加密SQLite3扩展,而wxsqlite3没有,不过目前知名的数据库管理工具Navicat使用的是wxsqlite3的库实现SQLite3的加密连接,所以为了后续维护的方便,故打算使用wxsqlite3。

扩展编译教程
首先你需要确保你没有将SQLite3扩展加入php主程序(编译时使用 --without-sqlite3 禁用 SQLite3 扩展),万一不幸加入了,我目前也不知道有什么好办法,感觉重新编译一下就好了。

到php官网下载相对应的php版本源码(本文以php-7.0.17为例)。

将下载的源码包放到root目录,并解压

tar -zxf php-7.0.17.tar.gz

进入SQLite3扩展源码目录

cd php-7.0.17/ext/sqlite3

将wxsqlite3源码里的 sqlite3secure/src 的所有文件拷贝进 /root/php-7.0.17/ext/sqlite3/libsqlite 生成并编辑预编译配置文件

cp config0.m4 config.m4
vi config.m4

将config.m4里的 sqlite3_extra_sources=“libsqlite/sqlite3.c” 替换成 sqlite3_extra_sources=“libsqlite/sqlite3secure.c” 生成预编译文件

phpize

预编译

./configure CFLAGS="-DSQLITE_HAS_CODEC"

编译并安装

make && make install

最后在php.ini里加载编译好的so文件即可,这时php就支持加密版本的SQLite3啦,么么哒。

### 如何对SQLite数据库进行加密 SQLite 是一种轻量级的嵌入式关系型数据库管理系统,在许多应用程序中得到了广泛应用。然而,默认情况下,SQLite 不具备内置的数据加密功能。为了增强安全性,可以使用第三方工具或库来实现 SQLite 数据库的加密。其中最常用的解决方案之一是 **SQLCipher**。 #### SQLCipher 的基本概念 SQLCipher 是一个基于 SQLite 的开源扩展库,它通过 AES-256 加密算法为 SQLite 提供了一个透明的安全层[^3]。这意味着所有的数据在写入磁盘之前都会自动加密,并且在读取时会自动解密。如果未设置密码,则 SQLCipher 将像普通的 SQLite 数据库一样运行[^2]。 --- #### 使用 SQLCipher 对 Android 应用中的 SQLite 进行加密 以下是关于如何在 Android 中使用 SQLCipher加密 SQLite 数据库的具体说明: 1. **引入依赖项** 需要在项目的 `build.gradle` 文件中添加 SQLCipher 的 Maven 仓库和依赖项: ```gradle repositories { mavenCentral() } dependencies { implementation &#39;net.zetetic:android-database-sqlcipher:4.5.0&#39; } ``` 2. **初始化加密数据库** 设置密码以启用加密功能。以下是一个简单的代码示例: ```java import net.sqlcipher.database.SQLiteDatabase; import net.sqlcipher.database.SQLiteOpenHelper; public class MyDatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "encrypted.db"; private static final int DATABASE_VERSION = 1; public MyDatabaseHelper(Context context, String password) { super(context, DATABASE_NAME, null, DATABASE_VERSION); SQLiteDatabase.loadLibs(context); // 初始化 SQLCipher 库 this.setWriteAheadLoggingEnabled(true); try (SQLiteDatabase db = openOrCreateDatabase(DATABASE_NAME, password, null)) { if (!db.isEncrypted()) { db.execSQL("PRAGMA rekey = &#39;" + password + "&#39;"); // 设置初始密码 } } catch (Exception e) { e.printStackTrace(); } } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE IF NOT EXISTS users (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS users"); onCreate(db); } } ``` 3. **操作加密后的数据库** 执行标准的 CRUD 操作即可,无需额外处理加密逻辑。例如: ```java String password = "my_secure_password"; // 密码应妥善保管 MyDatabaseHelper dbHelper = new MyDatabaseHelper(context, password); SQLiteDatabase db = dbHelper.getWritableDatabase(password); // 插入数据 db.execSQL("INSERT INTO users (name) VALUES (&#39;Alice&#39;)"); // 查询数据 Cursor cursor = db.rawQuery("SELECT * FROM users", null); while (cursor.moveToNext()) { System.out.println(cursor.getString(1)); } cursor.close(); db.close(); ``` 上述代码展示了如何创建、插入和查询加密SQLite 数据库[^1]。 --- #### 在其他平台上的 SQLCipher 实现 除了 Android 外,SQLCipher 还可以在多种平台上使用,包括但不限于 Qt 和 PHP。 ##### Qt 平台下的 SQLCipher 配置 对于 Qt 开发者来说,可以通过修改项目配置文件 `.pro` 添加 SQLCipher 支持。具体步骤如下: 1. 下载并编译 SQLCipher 源代码。 2. 修改 `.pro` 文件以链接到 SQLCipher 动态库。 3. 调用 `QSqlDatabase::setPassword()` 函数设置密码。 ##### PHP 环境下使用 SQLCipher PHP 可以借助 PDO 或 SQLite3 扩展SQLCipher 结合工作。下面是一段简单示例: ```php <?php $databaseFile = &#39;encrypted.db&#39;; $password = &#39;my_secure_password&#39;; try { $pdo = new PDO(&#39;sqlite:&#39; . $databaseFile); $pdo->exec("PRAGMA key = &#39;$password&#39;"); // 设置密码 // 创建表并插入数据 $pdo->exec("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)"); $pdo->exec("INSERT INTO users (name) VALUES (&#39;Bob&#39;)"); } catch (PDOException $e) { echo $e->getMessage(); } ?> ``` 此脚本演示了如何在 PHP 中加载已加密SQLite 数据库并执行基础命令。 --- #### 替代方案:Microsoft 提供的 C# 解决方案 虽然 SQLCipher 是跨平台的最佳选择,但对于某些特定场景(如 Windows 上的 C#),也可以考虑 Microsoft 推荐的方式。这种方法利用 ADO.NET 和 System.Data.Sqlite NuGet 包完成加密任务[^4]。 --- ### 总结 无论是移动端还是服务器端开发,都可以采用 SQLCipher 来保护 SQLite 数据库免受未经授权访问的影响。其核心优势在于无缝集成了强大的 AES-256 加密技术,同时保留了原生 SQLite API 的易用性和灵活性[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值