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使加密安全地存储在数据库中。然后将加密的字符串和唯一的盐值一起返回并存储在数据库中。

我的想法是,将存储在配置文件(而不是数据库)中的“私钥”放入混合中会为加密增加另一个级别的安全性,即使有人入侵数据库并获取加密值和盐,他们仍然没有解密数据所需的一切。

安全专家能否审查我的功能,并让我知道我的数据是否/如何被黑客入侵,以及我是否可以做任何其他事情来改进它?

我已将此问题移至https://security.stackexchange.com/questions/35690/is-this-data-encryption-storage-method-secure。感谢您的反馈意见。

4

2 回答 2

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);
于 2013-05-09T15:52:07.630 回答
2

我的两分钱...您的随机字符串并不是真正随机的,因为您使用的是基于时间的函数,而是考虑openssl_random_pseudo_bytes

其次,由于您没有明确提及它,您将希望将SSL/SSH用于这些类型的数据事务。

至于您的私钥,希望该配置文件位于可公开访问的目录之外,而不是在共享环境中。

于 2013-05-09T14:37:08.857 回答