这种数据加密/存储方法安全吗? [关闭]

Posted

技术标签:

【中文标题】这种数据加密/存储方法安全吗? [关闭]【英文标题】:Is this Data Encryption/Storage Method Secure? [closed] 【发布时间】:2013-05-03 23:55:30 【问题描述】:

首先让我说,我知道将敏感信息存储在 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 使加密安全地存储在数据库中。然后将加密的字符串和唯一的盐值一起返回并存储在数据库中。

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

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

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

【问题讨论】:

security.stackexchange.com 另外,codereview.stackexchange.com 【参考方案1】:

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

其次,由于您没有明确提及它,您需要使用SSL/SSH 处理这些类型的数据事务。

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

【讨论】:

感谢您的意见。我会考虑更换我的盐发生器。我们使用的是 SSL,因此数据传输是安全的。此外,公众无法访问私钥。 @BWDesign 公众无法访问?或者不在可公开访问的目录中(即存储在 Web 根目录之外)?两种不同的东西;) 感谢您的澄清。我会确保它在一个安全的目录中;) 因为盐只需要是唯一的,这不应该是一个大问题。【参考方案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);

【讨论】:

感谢 sn-p。我会调查的。您对整个脚本的安全性有什么意见吗?你知道它可能被黑客入侵/解密的任何方式吗? 我认为更改为 mcrypt_create_iv 和 Martin 先生的建议应该使它非常可靠。安全性将取决于加密密钥及其存储。 如果您使用 per-message salt,则不再需要 IV。 @CodesInChaos:是的,但使用md5(md5($key)) 一点用处都没有。尤其是对于那些稍后将其作为学习工具阅读的人。

以上是关于这种数据加密/存储方法安全吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

数据库的最佳+最强加密方法[关闭]

如何安全地存储加密密钥?

在 iphone/ipad 的持久存储上加密数据的最安全方法是啥?

这种加密有多安全? [关闭]

简单的密码加密 - 我该怎么做? [关闭]

PHP纯文本加密 - 保持密钥安全