1.21SQLCipher 簡介

SQLCipher 是一個基于 SQLite 的擴展,提供了透明的數據庫加密功能。與普通 SQLite 不同,SQLCipher 在數據寫入磁盤前自動加密,讀取時自動解密,無需開發者手動處理加密邏輯。這使得它非常適合移動應用、桌面應用等需要本地數據加密的場景。

特性SQLCipher
開發語言C(原生 SQLite 擴展)
加密方式內置 AES-256 加密,透明化處理
API 兼容性完全兼容 SQLite API
跨平臺支持原生支持多平臺(iOS、Android、Web)

Node.js 操作 SQLCipher 的實現

在 Node.js 環境中操作 SQLCipher,我們可以使用sqlcipher包,它是 SQLCipher 的 Node.js 綁定。下面詳細介紹如何在 Node.js 中使用 SQLCipher:

1. 安裝依賴

首先需要安裝sqlcipher包:

npm install sqlcipher
2. 基本操作示例

以下是一個完整的示例,展示了如何在 Node.js 中使用 SQLCipher 進行數據庫操作:

const sqlcipher = require('sqlcipher');
sqlcipher.verbose();// 打開或創建數據庫
const db = new sqlcipher.Database('encrypted.db');// 數據庫操作封裝為Promise
const execute = (db, sql, params = []) => {return new Promise((resolve, reject) => {db.run(sql, params, function(err) {if (err) {reject(err);} else {resolve(this);}});});
};const get = (db, sql, params = []) => {return new Promise((resolve, reject) => {db.get(sql, params, (err, row) => {if (err) {reject(err);} else {resolve(row);}});});
};const all = (db, sql, params = []) => {return new Promise((resolve, reject) => {db.all(sql, params, (err, rows) => {if (err) {reject(err);} else {resolve(rows);}});});
};// 初始化數據庫
async function initDatabase() {try {// 打開數據庫連接await new Promise((resolve, reject) => {db.open((err) => {if (err) {reject(err);} else {resolve();}});});// 設置加密密鑰(非常重要!)await execute(db, `PRAGMA key = 'your-strong-password-here';`);await execute(db, `PRAGMA cipher_compatibility = 4;`);// 創建表await execute(db, `CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY,username TEXT NOT NULL,email TEXT UNIQUE NOT NULL,created_at DATETIME DEFAULT CURRENT_TIMESTAMP)`);console.log('數據庫初始化完成');} catch (error) {console.error('數據庫初始化失敗:', error);throw error;}
}// 插入數據示例
async function insertUser(username, email) {try {const result = await execute(db, 'INSERT INTO users (username, email) VALUES (?, ?)', [username, email]);console.log(`插入用戶成功,ID: ${result.lastID}`);return result.lastID;} catch (error) {console.error('插入用戶失敗:', error);throw error;}
}// 查詢數據示例
async function getUsers() {try {const users = await all(db, 'SELECT * FROM users');return users;} catch (error) {console.error('查詢用戶失敗:', error);throw error;}
}// 更新數據示例
async function updateUserEmail(userId, newEmail) {try {await execute(db, 'UPDATE users SET email = ? WHERE id = ?', [newEmail, userId]);console.log(`更新用戶郵箱成功,ID: ${userId}`);} catch (error) {console.error('更新用戶郵箱失敗:', error);throw error;}
}// 刪除數據示例
async function deleteUser(userId) {try {await execute(db, 'DELETE FROM users WHERE id = ?', [userId]);console.log(`刪除用戶成功,ID: ${userId}`);} catch (error) {console.error('刪除用戶失敗:', error);throw error;}
}// 關閉數據庫
async function closeDatabase() {try {await new Promise((resolve, reject) => {db.close((err) => {if (err) {reject(err);} else {resolve();}});});console.log('數據庫已關閉');} catch (error) {console.error('關閉數據庫失敗:', error);throw error;}
}// 使用示例
async function runExample() {try {// 初始化數據庫await initDatabase();// 插入數據const userId = await insertUser('john_doe', 'john@example.com');// 查詢數據const users = await getUsers();console.log('所有用戶:', users);// 更新數據await updateUserEmail(userId, 'john.doe@example.com');// 再次查詢數據const updatedUsers = await getUsers();console.log('更新后的用戶:', updatedUsers);// 刪除數據await deleteUser(userId);// 最后查詢數據const finalUsers = await getUsers();console.log('刪除后的用戶:', finalUsers);} catch (error) {console.error('操作失敗:', error);} finally {// 關閉數據庫連接await closeDatabase();}
}// 執行示例
runExample();

關鍵操作說明

1. 數據庫加密設置
// 設置加密密鑰
await execute(db, `PRAGMA key = 'your-strong-password-here';`);// 設置加密兼容性(版本4是最新的加密算法)
await execute(db, `PRAGMA cipher_compatibility = 4;`);

這兩行代碼非常關鍵,必須在打開數據庫后立即執行。如果密鑰不正確,后續的數據庫操作將失敗。

2. 安全注意事項
  1. 密鑰管理:不要在代碼中硬編碼密鑰,尤其是在生產環境中。可以使用環境變量、配置文件或密鑰管理服務來存儲密鑰。

  2. 防止 SQL 注入:始終使用參數化查詢(如上面示例中的?占位符),避免直接拼接 SQL 字符串。

  3. 數據庫文件權限:確保數據庫文件的訪問權限設置正確,避免未授權訪問。

3. 性能考慮

SQLCipher 的加密操作會帶來一定的性能開銷,通常比普通 SQLite 慢 10-20%。在性能敏感的應用中,可以考慮:

  1. 使用批量操作減少加密 / 解密次數
  2. 優化查詢以減少不必要的數據處理
  3. 在內存中緩存頻繁訪問的數據
1. 備份加密數據庫
async function backupDatabase() {try {const backupDb = new sqlcipher.Database('backup.db');await new Promise((resolve, reject) => {backupDb.open((err) => {if (err) {reject(err);} else {resolve();}});});// 設置備份數據庫的密鑰(必須與源數據庫相同)await execute(backupDb, `PRAGMA key = 'your-strong-password-here';`);// 執行備份const backup = db.backup(backupDb);backup.step(1, (err, state) => {if (err) {console.error('備份失敗:', err);} else if (state === 1) {console.log('備份完成');}backup.finish();backupDb.close();});} catch (error) {console.error('備份數據庫失敗:', error);throw error;}
}
2. 自定義加密選項
// 設置加密算法(默認是 AES-256-CBC)
await execute(db, `PRAGMA cipher = 'aes-256-cfb';`);// 設置加密迭代次數(影響密鑰派生)
await execute(db, `PRAGMA kdf_iter = 64000;`);

這些選項可以根據安全需求進行調整,但需要注意不同的設置可能會影響兼容性和性能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87848.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87848.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87848.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

無人機不再“盲飛”!用Python搞定實時目標識別與跟蹤

友友們好! 我是Echo_Wish,我的的新專欄《Python進階》以及《Python!實戰!》正式啟動啦!這是專為那些渴望提升Python技能的朋友們量身打造的專欄,無論你是已經有一定基礎的開發者,還是希望深入挖掘Python潛力的愛好者,這里都將是你不可錯過的寶藏。 在這個專欄中,你將會…

Vue-7-前端框架Vue之應用基礎從Vue2語法到Vue3語法的演變

文章目錄 1 基于vite創建1.1 對比webpack和vite1.2 創建工程1.3 啟動項目2 調試工具Vue.js Devtools3 src結構3.1 index.html3.2 main.ts3.3 App.vue(根組件)4 示例(Vue2的語法)4.1 Person.vue4.2 App.vue4.3 選項式API對比組合式API4.4 程序流程5 示例(Vue3的語法)5.1 setup概…

上線iOSApp前抓包工具協作保障接口行為一致性(iOS抓包)

項目上線前,你是否總會擔心“接口是不是在某個邊緣條件下表現不一致”?哪怕單元測試通過、接口文檔齊全,真到線上用戶手上,總還是可能出現一些環境相關的異常。 最近參與某App大版本上線前的質量驗證流程,我們特別安排…

Java可變參數:靈活編程的秘密武器

Java可變參數的理解與應用 Java中的可變參數(Varargs)允許方法接受數量不定的同類型參數,簡化了方法調用時的參數傳遞。可變參數通過在參數類型后添加...實現,本質上是一個數組,但在調用時可以傳入多個單獨的參數。 …

汽車 CDC威脅分析與風險評估

汽車 CDC(連續阻尼控制系統)的威脅分析與風險評估需結合其技術特性、應用場景及行業標準展開。以下是詳細解析及實例說明: 一、CDC 系統技術原理與結構 CDC(Continuous Damping Control)通過實時調節懸掛阻尼力提升駕…

TensorFlow 安裝與 GPU 驅動兼容(h800)

環境說明TensorFlow 安裝與 GPU 驅動兼容CUDA/H800 特殊注意事項PyCharm 和終端環境變量設置方法測試 GPU 是否可用的 Python 腳本 # 使用 TensorFlow 2.13 在 NVIDIA H800 上啟用 GPU 加速完整指南在使用 TensorFlow 進行深度學習訓練時,充分利用 GPU 能力至關重要…

Laravel 項目中圖片上傳后無法訪問的問題

情況: Laravel 提供了 php artisan storage:link 命令,用于創建符號鏈接(Symbolic Link),將 storage/app/public 映射到 public/storage。但是上傳圖片之后 文件目錄確實有 但是無法訪問。 1. 刪除已經創建的 rm -rf…

Tesollo攜人形機器人手進軍國內市場

Tesollo靈巧手是Tesollo公司研發的一系列機器人靈巧手產品,涵蓋兩指到五指的設計 產品型號與特點 Delto-5F五指靈巧手:具備20個自由度,每個手指配備4個獨立關節,抓握力達到7公斤,每個關節空載可達75轉/分鐘&#xff0…

Python文件操作的“保險箱”:with語句深度實戰指南

目錄 一、with語句的底層運作原理 資源獲取階段 資源釋放階段 二、文件操作實戰場景解析 場景1:基礎文件讀寫 場景2:異常處理進階 場景3:復合資源管理 三、自定義上下文管理器 四、with語句的性能考量 五、實戰經驗總結 在Python編程中,文件操作是日常開發的高頻…

openKylin高校沙龍 | 走進成都高校,推動開源技術交流與人才培養

openKylin高校沙龍 | 成都高校 4月25日,CCF開源發展委員會“開源高校行”暨紅山開源openKylin高校行成都站圓滿舉辦,這場連接兩所大學的開源知識盛會,為成都信息工程大學與電子科技大學的300余名與會師生帶來了前沿的行業思考與技術實踐。Op…

即夢3.0更新后市面上的的評價如何?

設計師緊握數位板縮在墻角,全息投影中的AI正在生成同風格設計圖,地面倒影顯示“人類設計師生涯倒計時”。當最新一代AI繪圖工具悄然開啟測試時,設計圈陷入集體震動——有人驚嘆“以后還干XX,都回家賣煎餅吧”,也有人徹…

haproxy搭建nginx網站訪問

文章目錄 一.案例概述2.1 HTTP請求2.2 負載均衡常用調度算法①RR(Round robin)②LC(least connections)③SH(source hashing) 2.3 常見的web群集調度器3.實驗環境 二.實驗步驟1.兩臺web網站步驟相同 安裝we…

進程間通信之socketpair

進程間通信之socketpair 源代碼 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/wait.h>int main() {//父子通訊管道int m_pipe[2];//創建管道if(socketpa…

跟著AI學習C# Day29

&#x1f4c5; Day 29&#xff1a;C# 綜合進階知識回顧與職業發展建議 ? 學習目標&#xff1a; 回顧 C# 進階學習路徑&#xff1b;總結核心知識點&#xff0c;構建完整的技能體系&#xff1b;理解 C# 高級開發者應具備的核心能力&#xff1b;探索 C# 在不同技術領域的應用場…

茶席布置實訓室:傳承與創新的茶文化空間

一、茶席布置實訓室的重要意義 茶席布置實訓室是茶文化傳承與創新的重要載體。在現代社會&#xff0c;茶文化的弘揚不僅是對傳統的尊重&#xff0c;更是對生活品質和精神境界的追求。茶席布置實訓室為人們提供了一個專業、系統地學習和實踐茶文化的場所。它將理論知識與實際操…

jar is missing

在父POM中通過dependencyManagement統一管理版本&#xff0c;然后在子模塊中省略版本號。

Linux 內核中 TCP 協議棧的輸出實現:tcp_output.c 文件解析

在網絡通信領域,TCP(傳輸控制協議)作為核心的傳輸層協議,確保了數據在網絡中的可靠傳輸。Linux 內核中的 TCP 協議棧實現復雜而高效,其中 net/ipv4/tcp_output.c 文件是整個 TCP 協議棧的關鍵組成部分,負責處理數據包的發送、重傳、連接管理等核心功能。本文將深入解析該…

MySQL分頁原理與慢SQL優化實戰

分頁查詢的本質 在Web應用中&#xff0c;分頁是處理大量數據的常見需求。MySQL中的分頁通常使用LIMIT offset, size語法實現&#xff0c;例如&#xff1a; SELECT * FROM users ORDER BY id LIMIT 10000, 20; 這條語句看似簡單&#xff0c;但隱藏著性能陷阱。讓我們深入理解…

Taro:跨端開發的終極解決方案

在當今多終端并存的互聯網時代&#xff0c;開發者經常面臨一個難題&#xff1a;如何高效地為不同平臺&#xff08;如微信小程序、H5、React Native 等&#xff09;開發功能一致的應用&#xff1f;傳統的開發方式需要針對每個平臺單獨編寫代碼&#xff0c;不僅效率低下&#xff…

STM32F103C8T6 學習筆記摘要(三)

第一節 跑馬燈實驗 1. 了解電路 結構圖 說明一下&#xff1a; 那幾個LED的引腳線和數碼管的是一樣的&#xff0c;如果不想讓LED亮&#xff0c;就可以把J11的接線帽拔了這里的引腳是PA0-PA7 原理圖 說明一下&#xff1a; 當J11接線帽蓋上時&#xff0c;VCC3.3_LED就會有一個正…