2015-08-16 59 views
0

我不太習慣PHP,但我必須在PHP中使用一個快速函數。我正在使用提供API訪問權限的電子郵件。電子郵件必須包含在所有的API調用中。該電子郵件被加密存儲在數據庫中。如何最好地存儲和使用此電子郵件地址?目前我正在考慮這一點。如何在PHP中存儲敏感數據?

getEmail 
{ 
    //Retrieve value from DB 
    //decrypt using openssl_decrypt 
    return decrypted value 
} 

function1 
{ 
    $email = getEmail(); 
    API call 1 
} 

function2 
{ 
    $email = getEmail(); 
    API call 2 
} 

我擔心這種設計的東西是我必須做的檢索和解密多次(會變得更糟隨着越來越多的功能被添加)。我的問題是openssl_decrypt有多快?我可以安全地忽略對通話次數的擔憂嗎?或將電子郵件存儲在_Session安全中?任何其他方法?請幫幫我。我必須使設計快速而且安全。

+0

據我所知,將信息存儲在$ _SESSION數組中是安全的。 – kittykittybangbang

回答

4

在確定要緩解的威脅之前,甚至不要開始考慮加密。

有沒有萬能的答案,這是一個平衡之間的權衡和你可以忍受多少不便之間的權衡。

使對稱加密值得需要堅如磐石的密鑰存儲。只要您的密鑰泄露給攻擊者,數據就可以被認爲是妥協的。

在最極端的情況下,密鑰保存在自定義加密硬件上以控制訪問。稍微不太安全的是將密鑰存儲在可移動介質上,並在引導過程中將其直接複製到內存中。

在頻譜的另一端,您可以將密鑰存儲在進行en /解密的盒子的HDD上。後者不提供真正的安全性,因爲任何服務器的妥協都可能導致數據泄露。唯一的好處是阻止只能訪問Db的用戶看到數據。

如果你能明確說明你想要保護的是誰,我們可能會給出更有針對性的答案。

假設您可以拆分讀/寫的一種可能的替代方法是使用非對稱加密。這樣,您可以防止服務器讀取已寫入的數據。

  • 生成RSA公鑰/私鑰對
  • 給公鑰唯一
  • 要添加新記錄的Web服務器的訪問,Web服務器使用公共密鑰*
  • 要讀取的數據進行加密記錄,後端進程使用私鑰解密數據並酌情發送電子郵件/等*

這樣做的好處是危害網絡erver不會泄露系統中已有電子郵件地址的詳細信息,但是,它確實需要任何需要讀取數據的代碼都必須與Web服務器隔離。

*這是一個非常複雜的過程。根據需要,以保證有關數據到底是什麼,你需要做至少一些:

  • 散列數據
  • 生成一個加密的隨機密鑰
  • 加密對稱數據
  • 生成簽名
  • 加密使用公開密鑰
  • 對稱密鑰(存儲/檢索消息,按鍵,初始化矢量等)
  • 使用私鑰
  • 解密數據解密對稱密鑰
  • 驗證簽名
  • (更多)

注意,非對稱加密很快變得昂貴非常如消息長度的增加。出於這個原因,通常對稱地加密數據,然後不對稱地共享密鑰。這樣,消息大小是恆定的,並且可以選擇適當的密鑰大小。

上述任何錯誤都可能會導致數據泄露。如果你關心安全,不是嘗試這個在你自己的。找到一個好的圖書館,爲你做到這一切。挑選已經過很長時間並且已經多次審覈的產品。這樣有一個合理的機會是安全的。