2016-10-24 8 views
5

ユーザからのデータを保存して、何らかの理由でデータベースが漏洩してもそれらが役に立たなくなるようにしたい。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?

ありがとうございました!

+0

なぜデータベースにデータを格納するときに、データのシリアライズ/非シリアライズを使用しないでください。 – Haridarshan

+1

一般的な推奨事項: 'openssl_encrypt()'の代わりに[安全なPHP暗号化ライブラリ](https://github.com/defuse/php-encryption)を使用してください。具体的には、 'KeyProtectedByPassword'があなたにとって興味深いでしょう。 –

答えて

0
  1. 秘密鍵を生成するために使用される各ユーザーのためのいくつかの不変量を持っている:ユーザーID、アカウントの作成日、いくつかのランダム生成された塩...
  2. は、秘密鍵を生成しますハッシュ関数を記述します。
  3. 関数のコードを難読化します。

これは、コードとデータベースへのアクセスを持つ人々がデータを解読することができるようになりますが、それは、データベースの漏洩に対して安全でなければならない、それはあなたが言及して問題を持っていないので、完璧ではありません。

私が考えることができる唯一の安全な解決策は、ユーザーが自分の秘密鍵を生成し、クライアント側でデータを暗号化し、暗号化されたデータをサーバーに送信させることです。そうしないと、サーバーに解読に必要なツールがある場合、機密データを解読するためにシステムに完全にアクセスできる人が常に存在します。

私はこの問題について専門家ではありません。私が間違っているかどうか教えてください。

関連する問題