使用 Symfony 将用户数据安全地存储在数据库中
Posted
技术标签:
【中文标题】使用 Symfony 将用户数据安全地存储在数据库中【英文标题】:Securely store user data in DB with Symfony 【发布时间】:2017-03-06 02:14:27 【问题描述】:我想存储来自用户的数据,这样即使数据库以某种方式泄露,它们也变得毫无用处。我也不希望能够加密数据,所以我通过 `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
实际上是他们的密码,我将其放入会话变量中,如下所示:
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
(实际上对会话了解那么多)似乎是一个安全问题?
如果用户更改密码会发生什么。以目前的方式,我需要用新密码解密和重新加密他的所有数据库数据,所以这似乎不是一个合适的解决方案。如果他丢失了密码怎么办?
也许在这里更容易理解我想要什么:
我想加密用户自己输入的数据库中的所有数据。我希望它成为一个“功能”,即使是管理员也无法在没有密钥的情况下读取数据。我知道后者不是 100% 可能的(因为如果通过 Web 界面输入,会有办法拦截密码/密钥,但至少这涉及到一些代码更改)。这样的事情甚至可能吗?我可以看看任何开源项目吗?
谢谢!
【问题讨论】:
在数据库中存储数据时为什么不尝试使用数据序列化/反序列化。 一般建议:使用a secure PHP encryption library 而不是openssl_encrypt()
。具体来说,KeyProtectedByPassword
会引起您的兴趣。
【参考方案1】:
-
为每个用户设置一些用于生成私钥的不变量:用户 ID、帐户创建日期、一些随机生成的 salt...
编写将生成私钥的散列函数。
混淆函数代码。
这并不完美,因为可以访问代码和数据库的人将能够破译数据,但它应该可以安全地防止数据库泄漏,并且不存在您提到的问题。
我能想到的唯一更安全的解决方案是让用户生成自己的私钥并在客户端加密数据,然后将加密的数据发送到服务器。否则,如果服务器拥有解密所需的工具,那么对系统具有完全访问权限的人总是有办法解密敏感数据。
我不是这方面的专家,如果我错了,请告诉我。
【讨论】:
以上是关于使用 Symfony 将用户数据安全地存储在数据库中的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Symfony 2 中进入维护模式以安全地更新生产应用程序?