使用Symfony将用户数据安全地存储在DB中

Pri*_*muS 5 php security encryption symfony

我想存储来自用户的数据,这样即使数据库以某种方式泄露,它们也会变得无用.我也不想加密数据,所以我通过`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();
        ...
Run Code Online (Sandbox Code Playgroud)

$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')));
}

}
Run Code Online (Sandbox Code Playgroud)

2个问题:

  • 存储$passCode(whitout实际上知道很多关于会话)似乎可能是一个安全问题?

  • 如果用户更改密码会发生什么.使用当前的方式,我需要使用新密码解密并重新加密他的所有数据库数据,因此这似乎不是一个合适的解决方案.如果他丢失了密码怎么办?

也许更容易理解我想要的东西:

我想加密我的数据库中用户自己进入那里的所有数据.我希望它是一个"功能",甚至管理员也无法在没有密钥的情况下读取数据.我知道后者不是100%可能的(因为如果通过Web界面输入会有截取密码/密钥的方法,但至少可以调用代码的一些变化).这样的事情甚至可能吗?我可以看看任何开源项目?

谢谢!

Bar*_*ada 0

  1. 每个用户都有一些用于生成私钥的不变量:用户 ID、帐户创建日期、一些随机生成的盐...
  2. 编写一个哈希函数来生成私钥。
  3. 混淆函数的代码。

这并不完美,因为有权访问代码和数据库的人将能够破译数据,但它应该可以防止数据库泄漏,并且不会出现您提到的问题。

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

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