首先让我说,我知道将敏感信息存储在 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
使加密安全地存储在数据库中。然后将加密的字符串和唯一的盐值一起返回并存储在数据库中。
我的想法是,将存储在配置文件(而不是数据库)中的“私钥”放入混合中会为加密增加另一个级别的安全性,即使有人入侵数据库并获取加密值和盐,他们仍然没有解密数据所需的一切。
安全专家能否审查我的功能,并让我知道我的数据是否/如何被黑客入侵,以及我是否可以做任何其他事情来改进它?
我已将此问题移至https://security.stackexchange.com/questions/35690/is-this-data-encryption-storage-method-secure。感谢您的反馈意见。