
我知道我可以加密資料庫的特定字段,但我對加密資料庫的每個字段感興趣。我想確保任何有權存取 mysql shell 但無權存取解密金鑰的人都無法從資料庫中讀取任何內容。
我還想確保如果有人獲得了機器的 root 存取權限,但沒有解密金鑰,他們就無法讀取資料。
我該怎麼做?這樣做有意義嗎?我擔心如果有人有權利存取 mysql 資料庫,他們不可避免地會存取密鑰,所以這是沒有意義的。我錯過了什麼嗎?
答案1
可以使用最小的現場級 AES 和 DES 加密:https://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html#function_encrypt
如果沒有為每個查詢指定鍵(或不將其新增至觸發器/流程),任何人都無法讀取資料。
例子:
插入:
INSERT INTO users (username, password) VALUES ('root', AES_ENCRYPT('somepassword', 'key12346123'));
並選擇:
SELECT AES_DECRYPT(password, 'key12346123') FROM users WHERE username = 'root';
還有,這個需要與資料庫的 SSL 連線。
在較低層級 - 您也可以加密檔案系統。
答案2
MariaDB 最近為 InnoDB 和 XtraDB 表新增了表級加密。 https://mariadb.com/kb/en/mariadb/data-at-rest-encryption/#specifying-what-tables-to-encrypt
MySQL也支援InnoDB的表級加密。 https://dev.mysql.com/doc/refman/5.7/en/innodb-tablespace-encryption.html
答案3
第一:您將密鑰儲存在應用程式中,並在應用程式層處理所有加密。
接下來:確保 MySQL 實例和應用程式 [伺服器] 位於不同的電腦上,以便 MySQL 伺服器上的 root 攻擊不允許攻擊者從應用程式來源讀取金鑰。
這種做法似乎有些過分了。正確處理敏感資料(密碼、信用卡等),但對所有內容進行加密就有點矯枉過正了。 (並且在主鍵世界中可能會適得其反)