我想存储来自用户的数据,这样即使数据库以某种方式泄露,它们也会变得无用。我也不想加密数据,因此我通过`openssl_encrypt'加密我的所有数据。像这样:
$passCode = base64_encode($this->get('session')->get('_pk'));
if (strlen($passCode) <= 16) {
$iv = str_pad($passCode, 16, '0');
} else {
$iv = substr($passCode, 0, 16);
}
$ciphertext = openssl_encrypt('whatevervalue', 'AES-256-CBC', $passCode, 0, $iv);
$test = new Test();
$test->setValue($ciphertext);
...
$em->persist($test);
$em->flush();
...
$passCode
实际上是他们的密码,我把它放入会话var中:
SecurityListener.php
<?php
namespace AppBundle\Listener;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
class SecurityListener
{
public function __construct($security, Session $session)
{
$this->security = $security;
$this->session = $session;
}
public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
{
$this->session->set('_pk', base64_encode($event->getRequest()->get('_password')));
}
}
2个问题:
存储$passCode
(实际上知道会话的大部分内容)似乎可能是一个安全问题?
如果用户更改密码会发生什么。使用当前的方式,我需要使用新密码解密和重新加密他的所有数据库数据,因此这似乎不是一个合适的解决方案。如果他丢失了密码怎么办?
也许更容易理解我想要的内容:
我想加密用户自己进入的数据库中的所有数据。我希望它成为一个&#34;功能&#34;甚至管理员也无法在没有密钥的情况下读取数据。我知道后者不是100%可能的(因为如果通过Web界面输入会有截取密码/密钥的方法,但至少可以调用代码的一些变化)。这样的事情甚至可能吗?我可以看看任何开源项目吗?
谢谢!
答案 0 :(得分:0)
这并不完美,因为有权访问代码和数据库的人将能够破译数据,但它应该可以安全地防止数据库泄漏,并且它没有您提到的问题。
我能想到的唯一更安全的解决方案是让用户生成自己的私钥并在客户端加密数据,然后将加密数据发送到服务器。否则,如果服务器具有解密所需的工具,那么对于完全访问系统的人来说,总会有办法解密敏感数据。
我不是这方面的专家,如果我错了,请告诉我。