亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從 MySQL 普通數據庫值遷移到完全 AES 加密值 (PHP APi)

從 MySQL 普通數據庫值遷移到完全 AES 加密值 (PHP APi)

PHP
炎炎設計 2022-07-16 17:52:51
短的:由于 GDPR 法規,從純文本數據庫值遷移到完全/完全加密值的最佳方法?解釋器:我剛剛收到一個“提示”,由于 GDPR(歐盟通用數據保護條例)法律要求的新“設計隱私”概念,所有“敏感”信息都需要加密。這包括姓名、地址、社交媒體資料、..我們目前正在為 2000 多個用戶運行一個完整的生產數據庫,只能通過我們的 PHP REST API 訪問,該 API 用作所有 Web 和移動應用程序的入口點(還沒有第三方開發人員)。該數據庫包含當前以純文本形式存儲的電子郵件地址、地址、社交媒體句柄、姓名、IP 地址……(除了基于安全的敏感信息,如密碼、令牌……或用于身份驗證的任何其他值) /鑒別)。我不是這個(開發方面)的忠實粉絲,因為市長對性能、搜索算法、整個 PHP API 等的影響(感覺就像整個優化和“完美設置數據庫”的結束),但因為它是必需的因為它是額外的保護層,所以我全力以赴?,F在,我主要關心的是......一切都在積極運行,我們不能只是說“好的,關閉服務器,加密一切,部署新的 API 版本并重新打開它?!?。此外,我認為這種遷移不能“一步一步”完成,所有事情都必須一次完成。如果 API 未準備好在所有查詢中處理解密,則無法加密數據庫值,反之亦然,如果 API 期望所有內容都被加密,則數據庫不能是純文本。(我很高興我將整個 API 類型的交易作為數據庫的唯一入口/讀取點,沒有自定義腳本/連接,所以這是一種解脫)我們正在運行一個功能強大的 VPS 服務器,因此由于冗余檢查和諸如此類的東西會導致一些性能損失,而且我們也在運行 staging/dev 環境,所以測試沒有問題。我會讓 MySQL 為每條記錄使用唯一鍵處理 AES,該鍵基于 ID(主鍵)和創建時間戳的組合,例如(這兩個值永遠不會改變)(這可能不是那么聰明萬一“出于某種原因”這個值確實發生了變化,數據已經消失了..所以不確定),這樣我的 PHP 應用程序在運行查詢時不需要以純文本形式傳遞密鑰,但是又一次, “創建解密密鑰”在查詢日志等中仍然可見,因此“最安全”的方法是讓 PHP 應用程序加密和解密所有傳入/傳出數據,但這會導致無法例如運行“搜索查詢”(除非我在這些特定查詢中發送密鑰..)。我的問題:怎么會這樣..?我應該讓 PHP 處理加密/解密還是更好的 MySQL?當記錄被請求時,是否有一種可用的方法可以遷移到加密值?..?我的想法是不觸及任何數據庫值(除了更新每個非整數列以處理當前指定的字符數量的 2-3 倍),這可以在不影響生產的情況下完成。然后逐步更新所有 API 查詢,以檢查所選值是否已加密。當一個部分運行正常時,更新該部分的表以加密所有值。作為一個(簡單的)例子MySQL方式;每個 SELECT 查詢:SELECT IF_AES_ENCRYPTED(first_name, AES_DECRYPT(first_name), first_name) AS first_name FROM contacts WHERE id = 1;(或)PHP 方式:檢索數據:while ($row = $result->fetch_assoc()) {  $contact->setFirstName((IS_AES_ENCRYPTED($row['first_name']) ? AES_DECRYPT($row['first_name']) : $row['first_name']);}在部署結束時:UPDATE contacts SET first_name = AES_ENCRYPT(first_name);肯定有辦法做到這一點,但由于我是目前唯一的開發人員,我只是不確定什么是最實用/最有效的方法,或者我是否過度或考慮不足或不。只是在尋找其他執行過這樣的遷移/更新的開發人員。謝謝,伯特。
查看完整描述

1 回答

?
白板的微信

TA貢獻1883條經驗 獲得超3個贊

我會通過添加一個新列first_name_enc來存儲字符串的加密版本來做到這一點。


然后,您可以在過渡到完全加密時臨時存儲加密和未加密的值。


ALTER TABLE contacts ADD COLUMN first_name_enc VARBINARY(...);

當你讀取值時,解密它,但如果值為 NULL,那么它必須是尚未轉換的行,所以回退到原始的未加密列。


SELECT COALESCE(AES_DECRYPT(first_name_enc, <key-string>), first_name) ...

在整個應用程序中放置此代碼后,您可以開始批量轉換行:


UPDATE contacts SET

  first_name_enc = AES_ENCRYPT(first_name, <key-string>), 

  first_name = NULL

WHERE id BETWEEN 1 AND 1000;

在您完成將所有內容轉換為加密并且您的應用程序不再插入未加密的列之后,您可以將條件查詢轉換為簡單地讀取加密的列并對其進行解密。


SELECT AES_DECRYPT(first_name_enc, <key-string>) ...

然后最后刪除未加密的列,因為它們現在只包含 NULL。


ALTER TABLE contacts DROP COLUMN first_name;

我建議您在投入時間進行這項工作之前,先確認您真正需要做的有關加密的事情。我讀過聲稱 GDPR 實際上并未強制加密的文章。https://www.i-scoop.eu/gdpr-encryption/


但對互聯網文章持保留態度。請咨詢合格的專家。即使支付專業專家的咨詢費,也可能為您節省數以萬計的軟件開發成本!


查看完整回答
反對 回復 2022-07-16
  • 1 回答
  • 0 關注
  • 132 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號