2017-06-17 60 views
2

我已經閱讀了很多關於加密和認識了很多新的東西已經出來了,因爲PHP 7.我寫兩個功能(加密和decrpyt)存儲在我的數據庫加密的數據。OpenSSL編成密碼隨機密鑰和IV-存放在DB

我瞭解OpenSSL的功能的作品,但我想知道如果我在我的數據庫存儲得當,或者我應該說安全。我的代碼如下:

function wm_encryptString($string) { 
    $method = 'aes-256-xts'; 
    $key = random_bytes(16); 
    $iv = random_bytes(16); 
    $cipherText = openssl_encrypt($string, $method, $key, 0, $iv); 
    $cipherText = $key.$iv.$cipherText; 
    $cipherText = base64_encode($cipherText); 
    return $cipherText; 
} 

function wm_decryptString($cipher) { 
    $cipher = base64_decode($cipher); 
    $method = 'aes-256-xts'; 
    $key = substr($cipher, 0, 16); 
    $iv = substr($cipher, 16, 16); 
    $cipher = substr($cipher, 32); 
    $readableText = openssl_decrypt($cipher, $method, $key, 0, $iv); 
    return $readableText; 
} 

當我運行這兩個函數它加密和解密就好了。我的具體問題是,是使用隨機字節生成密鑰和IV安全,並將其附加到密文安全存儲在數據庫?我存儲了一些敏感信息,並希望確保它被安全地加密。

我的第二個問題是,我知道我可以使用這些函數加密字符串,但我可以加密使用此功能相同的斑點?我在我的數據庫中存儲了一些文檔(我知道很多人會說從不將數據存儲在數據庫中,但是使用數據庫,因爲我只存儲少於100個文檔,並且使備份更容易)。我可以使用這個相同的功能加密一個blob /文件嗎?

任何反饋將不勝感激,因爲我希望我的應用盡可能安全。注意我知道我必須採取更多的安全措施來確保我的應用程序是安全的,我的問題僅限於加密。謝謝。

回答

0
  1. 對於密鑰和IV的隨機字節是好的,將IV加到加密數據的前面是好的,兩者都是安全的選擇。

  2. 加密是基於字節,它不關心任何編碼,BLOB或其他方式。對於文本獲取字節爲utf-8。

  3. 爲什麼會選擇XTS模式,它一般用於磁盤加密?見You Dont Want XTS。通常CBC或CTR模式是正確的選擇。請注意,使用CBC不會返回添加錯誤,CTR不會使用相同的IV(計數器初始值)和鍵 - 很容易出錯。

最後,你打算如何保護加密密鑰?這是最難的部分。

+0

這真的是我的問題嗎?我無法找到存儲密鑰的行業標準。沒有人有關於如何/在哪裏存儲密鑰的建議? – user982853

+0

存儲和保護密鑰顯然很重要,加密不會比密鑰更安全。關鍵存儲沒有行業標準。您需要根據您的威脅模型確定所需的安全級別。攻擊者的範圍從阻止好奇到挫敗的民族國家。選項可以從便箋,配置文件以及高端HSM中的物理安全位置運行。 – zaph

1

由於密鑰存儲在密文旁邊,因此該方案不提供任何真正的安全性。相反,這是混淆。通過隱藏的安全性術語將適用於它。

請記住,關鍵是需要保持祕密的唯一部分。這就是所謂的Kerckhoffs principle。通常假設攻擊者能夠在服務器被破壞時讀取服務器端代碼的源代碼。在這種情況下,設計一個密鑰對攻擊者保密的方案几乎是不可能的(思考硬件安全模塊)。

當然,有不同類型的違規行爲。當攻擊者只能訪問數據庫記錄而沒有實際訪問Web服務器上的shell時,您可能會感到幸運。當Web應用程序不能正確驗證和授權請求以及可以從數據庫查詢任意信息的錯誤時(思考SQL注入),就會發生這種情況。
即使在這種情況下,攻擊者也許只是通過查看數據就可以知道數據是如何加密的(所有密文長度的統計數據都是很好的線索)。