ユーザからのデータを保存して、何らかの理由でデータベースが漏洩してもそれらが役に立たなくなるようにしたい。Symfonyを使ってDBにユーザデータを安全に保存
$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に入れて自分のパスワード、次のとおりです。私はまた、データを暗号化することができるようにしたくないので、私はこのような `openssl_encrypt」を介してすべての私のデータを暗号化します:
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
(実際にはセッションについて多く知っている人)はおそらくセキュリティ上の問題と思われますか?ユーザーがパスワードを変更するとどうなりますか。現在の方法では、新しいパスワードですべてのDBデータを復号化して再暗号化する必要があるため、適切な解決策のようには見えません。もし彼がパスワードを失ったら?
は、私は、ユーザー自身がそこに入る私のデータベース内のすべてのデータを暗号化する:
は、多分私がここに欲しいものを理解することは簡単です。私はそれが管理者でさえキーなしでデータを読むことができない "機能"であることを望んでいます。私は後者が100%可能ではないことを知っています(Webインターフェイスから入力した場合パスワード/キーを傍受する方法がありますが、少なくともコードの変更があります)。そのようなものはまったく可能ですか?私は見ていることができますオープンソースのporjects?
ありがとうございました!
なぜデータベースにデータを格納するときに、データのシリアライズ/非シリアライズを使用しないでください。 – Haridarshan
一般的な推奨事項: 'openssl_encrypt()'の代わりに[安全なPHP暗号化ライブラリ](https://github.com/defuse/php-encryption)を使用してください。具体的には、 'KeyProtectedByPassword'があなたにとって興味深いでしょう。 –