簡體   English   中英

在加密的數據庫字段上支持部分字符串匹配的安全方法

[英]Secure method for supporting partial string matching on an encrypted database field

我正在編寫一個使用PHP + MySQL的Web應用程序。 我知道PHP和MySQL都可以執行數據加密。 我還讀到,就安全性而言,在PHP級別加密數據更為可取。 但是現在我遇到了這個問題:我想加密某些用戶數據的地址字段。 但是在使用PHP編寫的網頁中,我想支持地址字段的部分字符串匹配。 我當前的解決方案是在MySQL級別加密數據,然后像這樣進行搜索:

// PHP code for inserting data into database
mysql_query("INSERT INTO test VALUES ('', AES_ENCRYPT('" . $addr . "', UNHEX('" . $hexstring . "')))", $link);

// PHP code for partial string matching
mysql_query("SELECT * FROM test WHERE AES_DECRYPT(address, UNHEX('" . $hexstring . "')) like '%Street%'", $link);

有沒有更安全的方式在PHP級別而不是MySQL級別執行加密? 我能想到的是檢索所有記錄,用PHP解密數據並執行匹配,但這會非常慢。 AES不是必須的,任何加密/解密方法都可以,只要它足夠安全即可。

我想加密一些用戶數據的地址字段。 但是在使用PHP編寫的網頁中,我想支持地址字段的部分字符串匹配。

這是加密數據庫的困難。 您必須在以下兩者之一中進行選擇:

  1. 實驗性的學術設計,例如訂單顯示加密,缺乏我們在加密數據時通常期望的語義安全性。
  2. 通過盲索引和Bloom過濾器進行認證的加密。

如果您願意使用后一種方法(我願意),則該過程有些簡單:

  1. 為您希望支持的每個部分匹配生成一個單獨的密鑰。
  2. 創建一個將明文確定性地轉換為哈希前消息的函數(例如,街道名稱和道路名稱的第一個字母( 123 Main Street => 123m等)
  3. 在步驟2的輸出上使用安全的密鑰哈希結構,例如hash_hmac()hash_pbkdf2()
  4. (可選):將第3步的輸出截斷為少量字節(例如8個十六進制字符)。 這意味着您的搜索結果中出現更多的誤報,但是與可以訪問您的數據庫服務器的對手相比,可以從您的明文中學到的事實卻很少那么獨特。
  5. 將其與密文一起存儲,密文本身應進行安全加密

當然,如果您的加密密鑰與數據庫服務器存儲在同一硬件上,那么所有這些都是徒勞的。 能夠訪問數據庫(例如SQL注入)的攻擊者可以逃逸到文件系統並竊取密鑰,除非Web服務器和數據庫位於單獨的硬件上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM