这种数据加密/存储方法安全吗? [关闭]
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))
一点用处都没有。尤其是对于那些稍后将其作为学习工具阅读的人。以上是关于这种数据加密/存储方法安全吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章