2013-05-09 116 views
0

讓我先說我知道這是一個壞主意將敏感信息存儲在mysql數據庫,所以請不要回應說「不要做」或什麼的效果。我正在建立一個網站,它是絕對必要的來存儲社會安全號碼,我必須能夠從數據庫中取回數據(無散列)。這就是說,我研究了加密/解密數據的最佳方法,並構建了一個自定義函數來處理加密。這裏是我的加密功能:此數據加密/存儲方法是否安全?

function my_data_encrypt($value){ 
    $salt=substr(uniqid('', true), 0, 20); 
    $key=$salt.MY_PRIVATE_KEY; 
    $enc_value=base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $value, MCRYPT_MODE_CBC, md5(md5($key)))); 
    return array("enc_value"=>$enc_value, "salt"=>$salt); 
} 

所以基本上我生成了我的鹽一個隨機字符串,然後附加到鹽,在一個單獨的配置文件中定義的私有密鑰MY_PRIVATE_KEY。然後,我使用mcrypt_encrypt加密數據,然後使用base64_encode使加密安全地存儲在數據庫中。然後將加密的字符串和唯一的salt返回並一起存儲在DB中。

我的想法是,將存儲在配置文件(不是數據庫)中的「私鑰」放入混合中會爲加密增加另一級別的安全性,即使有人攻擊了數據庫並獲得了加密值和salt,他們仍然沒有解密數據所需的一切。

您可以安全專家檢查我的功能,並讓我知道我的數據是否可以被黑客入侵,以及如果我還有其他事情可以改善它?

我已將此問題移至https://security.stackexchange.com/questions/35690/is-this-data-encryption-storage-method-secure。感謝您的反饋意見。

+4

security.stackexchange.com – 2013-05-09 13:28:39

+0

此外,http://codereview.stackexchange.com – 2013-05-09 13:28:59

回答

2

我的兩分錢...您的隨機字符串不是真正隨機的,因爲您使用的是基於時間的函數,而不是考慮openssl_random_pseudo_bytes

其次,因爲你沒有明確提到它,你會想要爲這些類型的數據事務使用SSL/SSH

就你的私鑰而言,希望該配置文件位於可公開訪問的目錄之外,而不是在共享環境中。

+0

感謝您的輸入。我會考慮更換我的鹽發生器。我們使用SSL,所以數據傳輸是安全的。此外,私人密鑰不可供公衆使用。 – BWDesign 2013-05-09 15:39:02

+0

@BWDesign無法公開?或者不在公開的目錄中(即,存儲在Web根目錄之外)?兩種不同的東西;) – 2013-05-09 15:46:06

+0

感謝您的澄清。我會確保它在一個安全的目錄中;) – BWDesign 2013-05-09 16:52:54

2

您應該使用mcrypt_create_iv而不是md5(md5($key))來生成初始化向量。將它與密文和鹽一起存儲。

$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC)); 
$enc_value=base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $value, MCRYPT_MODE_CBC, $iv)); 
return array("enc_value"=>$enc_value, "salt"=>$salt, "iv"=>$iv); 
+0

感謝您的片段。我會研究這一點。對於整個腳本的安全性,您有任何意見嗎?你知道任何可能被黑/解密的方式嗎? – BWDesign 2013-05-09 16:52:01

+1

我認爲改爲mcrypt_create_iv,而馬丁先生的建議應該讓它變得非常穩固。安全性將取決於加密密鑰及其存儲。 – mcrumley 2013-05-09 19:01:12

+0

如果您使用每條消息的鹽,則不再需要IV了。 – CodesInChaos 2013-05-10 11:02:59