使用PHP與SQL搭建可搜尋的加密資料庫
本文講的是使用PHP與SQL搭建可搜尋的加密資料庫,我們從一個簡單的場景開始(這可能與很多地方政府或醫療保健應用非常相關):
<?php class InsecureExampleOne { protected $db; protected $key; public function __construct(PDO $db, string $key = ``) { $this->db = $db; $this->key = $key; } public function searchByValue(string $query): array { $stmt = $this->db->prepare(`SELECT * FROM table WHERE column = ?`); $stmt->execute([ $this->insecureEncryptDoNotUse($query) ]); return $stmt->fetchAll(PDO::FETCH_ASSOC); } protected function insecureEncryptDoNotUse(string $plaintext): string { return bin2hex( openssl_encrypt( $plaintext, `aes-128-ecb`, $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING ) ); } }
CREATE TABLE humans ( humanid BIGSERIAL PRIMARY KEY, first_name TEXT, last_name TEXT, ssn TEXT, /* encrypted */ ssn_bidx TEXT /* blind index */ ); CREATE INDEX ON humans (ssn_bidx);
<?php /* This is not production-quality code. * It`s optimized for readability and understanding, not security. */ function encryptSSN(string $ssn, string $key): string { $nonce = random_bytes(24); $ciphertext = sodium_crypto_secretbox($ssn, $nonce, $key); return bin2hex($nonce . $ciphertext); } function decryptSSN(string $ciphertext, string $key): string { $decoded = hex2bin($ciphertext); $nonce = mb_substr($decoded, 0, 24, `8bit`); $cipher = mb_substr($decoded, 24, null, `8bit`); return sodium_crypto_secretbox_open($cipher, $nonce, $key); } function getSSNBlindIndex(string $ssn, string $indexKey): string { return bin2hex( sodium_crypto_pwhash( 32, $ssn, $indexKey, SODIUM_CRYPTO_PWHASH_OPSLIMIT_MODERATE, SODIUM_CRYPTO_PWHASH_MEMLIMIT_MODERATE ) ); } function findHumanBySSN(PDO $db, string $ssn, string $indexKey): array { $index = getSSNBlindIndex($ssn, $indexKey); $stmt = $db->prepare(`SELECT * FROM humans WHERE ssn_bidx = ?`); $stmt->execute([$index]); return $stmt->fetchAll(PDO::FETCH_ASSOC); }
是否真的可以安全使用,還是說可能仍然會洩漏資料,就像濾網一樣? 它的用途有什麼侷限性?(這一個其實已經回答了。)
CREATE TABLE humans ( humanid BIGSERIAL PRIMARY KEY, first_name TEXT, /* encrypted */ last_name TEXT, /* encrypted */ ssn TEXT, /* encrypted */ ); CREATE TABLE humans_filters ( filterid BIGSERIAL PRIMARY KEY, humanid BIGINT REFERENCES humans (humanid), filter_label TEXT, filter_value TEXT ); /* Creates an index on the pair. If your SQL expert overrules this, feel free to omit it. */ CREATE INDEX ON humans_filters (filter_label, filter_value);
原文釋出時間為:2017年5月28日
本文作者:Change
本文來自雲棲社群合作伙伴嘶吼,瞭解相關資訊可以關注嘶吼網站。
相關文章
- 黃東旭:“向量資料庫”還是“向量搜尋外掛 + SQL 資料庫”?資料庫SQL
- 海量資料搜尋---搜尋引擎
- 可搜尋加密技術 - 學習筆記(一)加密筆記
- 使用elasticsearch搭建自己的搜尋系統Elasticsearch
- 使用solr搭建搜尋伺服器Solr伺服器
- 資料結構之PHP二分搜尋樹資料結構PHP
- 屬性動畫跳轉展示資料(可切換可搜尋)動畫
- 對 JSON 資料的搜尋JSON
- SQL Server資料庫中表和索引結構儲存的原理及如何加快搜尋速度分析SQLServer資料庫索引
- 資料結構與演算法 排序與搜尋資料結構演算法排序
- 使用 Postgres 的全文搜尋構建可擴充套件的事件驅動搜尋架構套件事件架構
- sql.bsq與資料庫的建立SQL資料庫
- SQL資料庫全域性搜尋字串(key&value)/無需執行查詢語句/不漏搜任何字串SQL資料庫字串
- SQL Server2019資料庫備份與還原指令碼,資料庫可批量備份SQLServer資料庫指令碼
- layui資料表格搜尋UI
- tiktok商品搜尋資料
- openGauss核心分析(十):資料庫搜尋引的建立過程資料庫
- 解決 PbootCMS 搜尋未搜尋到任何資料的問題boot
- 在登入資料庫的使用!sql資料庫SQL
- Blazor使用sql server 資料庫BlazorSQLServer資料庫
- AI之旅-語義搜尋:初識 vector embedding 與部署向量資料庫 qdrantAI資料庫
- 直播系統搭建,可自動模糊匹配的搜尋下拉框
- 【資料庫資料恢復】SQL server資料庫被加密怎麼辦?如何恢復?資料庫資料恢復SQLServer加密
- Elasticsearch 的配置與使用,為了全文搜尋Elasticsearch
- MySQL 資料庫與 SQL 優化MySql資料庫優化
- 資料庫加密資料庫加密
- 過濾搜尋引擎的抓取資料
- tiktok商品搜尋資料分析
- tiktok商品搜尋資料工具
- 【資料結構】搜尋樹資料結構
- Elasticsearch搜尋資料彙總Elasticsearch
- 直播軟體搭建,利用精準搜尋最佳化使用者搜尋體驗
- 關於SQL Server資料庫中的使用者許可權和角色管理SQLServer資料庫
- 「效率集」聚合搜尋,瀏覽器必備的資源與資訊搜尋外掛瀏覽器
- 海量資料搜尋---demo展示百度、谷歌搜尋引擎的實現谷歌
- SAP CRM產品主資料搜尋功能的With individual object搜尋引數Object
- 開務資料庫魏可偉 讓資料庫會思考—SQL最佳化技術的挑戰與未來資料庫SQL
- 搜尋引擎es-分詞與搜尋分詞
- 伺服器SQL server資料庫被加密恢復方案伺服器SQLServer資料庫加密