【发布时间】: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会引起您的兴趣。
标签: php symfony security encryption