使用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
本文來自雲棲社群合作伙伴嘶吼,瞭解相關資訊可以關注嘶吼網站。
相關文章
- 【譯】使用PHP和SQL構建可搜尋的加密資料庫PHPSQL加密資料庫
- 黃東旭:“向量資料庫”還是“向量搜尋外掛 + SQL 資料庫”?資料庫SQL
- VB6基本資料庫應用(八):模糊搜尋與基於範圍的搜尋資料庫
- 海量資料搜尋---搜尋引擎
- 可搜尋加密技術 - 學習筆記(一)加密筆記
- 使用elasticsearch搭建自己的搜尋系統Elasticsearch
- 屬性動畫跳轉展示資料(可切換可搜尋)動畫
- 使用solr搭建搜尋伺服器Solr伺服器
- 資料結構之PHP二分搜尋樹資料結構PHP
- 資料結構與演算法 排序與搜尋資料結構演算法排序
- 資料結構與演算法 - 排序與搜尋資料結構演算法排序
- SQL Server 和資料庫加密金鑰SQLServer資料庫加密
- 使用 Postgres 的全文搜尋構建可擴充套件的事件驅動搜尋架構套件事件架構
- layui資料表格搜尋UI
- 對 JSON 資料的搜尋JSON
- 解決 PbootCMS 搜尋未搜尋到任何資料的問題boot
- 直播系統搭建,可自動模糊匹配的搜尋下拉框
- 可擴充套件的搜尋元件套件元件
- 建立SQL Server 和資料庫加密金鑰SQLServer資料庫加密
- SQL Server資料庫中表和索引結構儲存的原理及如何加快搜尋速度分析SQLServer資料庫索引
- Elasticsearch 的配置與使用,為了全文搜尋Elasticsearch
- 在PHP中使用AES加密演算法加密資料及解密資料PHP加密演算法解密
- SQL資料庫全域性搜尋字串(key&value)/無需執行查詢語句/不漏搜任何字串SQL資料庫字串
- tiktok商品搜尋資料
- 【資料結構】搜尋樹資料結構
- Elasticsearch搜尋資料彙總Elasticsearch
- 過濾搜尋引擎的抓取資料
- Mashable:Google搜尋背後的資料Go
- PHP 匯入資料庫 sql 檔案PHP資料庫SQL
- 直播軟體搭建,利用精準搜尋最佳化使用者搜尋體驗
- 搜尋引擎es-分詞與搜尋分詞
- openGauss核心分析(十):資料庫搜尋引的建立過程資料庫
- 海量資料搜尋---demo展示百度、谷歌搜尋引擎的實現谷歌
- ElasticSearch大資料分散式彈性搜尋引擎使用Elasticsearch大資料分散式
- 資料庫加密資料庫加密
- PHP如何使用GeoIP資料庫PHP資料庫
- sql.bsq與資料庫的建立SQL資料庫
- MS SQL資料庫SA許可權入侵的感悟SQL資料庫