Php 使用Symfony在数据库中安全存储用户数据

Php 使用Symfony在数据库中安全存储用户数据,php,symfony,security,encryption,Php,Symfony,Security,Encryption,我想存储来自用户的数据,这样即使数据库以某种方式泄漏,它们也会变得无用。我也不想对数据进行加密,因此我通过“openssl_encrypt”对所有数据进行加密,如下所示: $passCode = base64_encode($this->get('session')->get('_pk')); if (strlen($passCode) <= 16) { $iv = str_pad($passCode, 16, '0')

我想存储来自用户的数据,这样即使数据库以某种方式泄漏,它们也会变得无用。我也不想对数据进行加密,因此我通过“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();
        ...
2个问题:

  • 存储
    $passCode
    (实际上不太了解会话)可能是一个安全问题

  • 如果用户更改密码会发生什么情况。按照目前的方式,我需要用新密码解密并重新加密他的所有数据库数据,所以这似乎不是一个合适的解决方案。如果他泄露了密码怎么办

也许更容易理解我想在这里说什么:

我想加密数据库中用户自己输入的所有数据。我希望这是一个“功能”,即使管理员(s)不能读取没有密钥的数据。我知道后者不是100%可能的(因为如果通过web界面输入密码/密钥,将有办法拦截,但至少代码会有一些变化)。这样的事情可能吗?有什么开源项目我可以看一下吗

谢谢大家!

  • 为每个用户提供一些用于生成私钥的不变量:用户ID、帐户创建日期、一些随机生成的salt
  • 编写一个将生成私钥的哈希函数
  • 混淆函数的代码
  • 这并不是完美的,因为有权访问代码和数据库的人将能够破译数据,但它应该能够防止数据库泄漏,并且不会出现您提到的问题

    我能想到的唯一更安全的解决方案是让用户生成自己的私钥并在客户端加密数据,然后将加密数据发送到服务器。否则,如果服务器具有解密所需的工具,则总是有能够完全访问系统的人能够解密敏感数据


    我不是这方面的专家,如果我错了,请告诉我。

    为什么不在数据库中存储数据时尝试使用数据序列化/非序列化。一般建议:使用而不是
    openssl\u encrypt()
    。具体而言,
    KeyProtectedByPassword
    将引起您的兴趣。
    <?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')));
    }
    
    }