这种数据加密/存储方法是否安全?

时间:2013-05-09 13:26:26

标签: php security encryption mcrypt

首先让我说我知道将敏感信息存储在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);
}

所以基本上我正在为我的salt生成一个随机字符串,然后在salt上附加一个私钥MY_PRIVATE_KEY,它在一个单独的配置文件中定义。然后,我使用mcrypt_encrypt加密数据,然后使用base64_encode使加密安全存储在数据库中。然后返回加密的字符串和唯一的salt并将其一起存储在DB中。

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

您的安全专家是否可以审核我的功能,让我知道我的数据是否/如何被黑客入侵,以及我还能做些什么来改进它?

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

2 个答案:

答案 0 :(得分:2)

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

其次,因为您没有明确提及它,所以您需要将SSL/SSH用于这些类型的数据事务。

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

答案 1 :(得分: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);