2012-02-15 13 views
0

私は、ユーザーがマスターパスワードを使用して一連のパスワードを保存してアクセスできるPHPでパスワードマネージャを構築しています。データベースは単純なXMLファイルで、mcryptを使用して暗号化され、ディスクに保存されます。PHPセッションで暗号化されたデータを編集する

編集:各ユーザーには独自のデータベースファイルがあります。

問題は次のとおりです。ユーザーが自分のパスワードの1つを編集すると、データベースの暗号化、変更、および暗号化を再度実行する必要があります。ユーザーが何かを編集するたびに、データベースにアクセスするために自分のマスターパスワードを知る必要があるので、パスワードをサーバーのどこかに一時的に保存するか、変更するたびにユーザーが入力する必要があります。

私は、セッション変数にパスワードを格納するとセキュリティ上の問題が発生する可能性があることを知っています。

:私はプロジェクトをホストしているサーバーへのルートまたは物理アクセスを持っていないので、設定を変更することはできません。

+1

なぜ実際のデータベースを使用していませんか? –

+0

なぜデータベースにアクセスするにはマスターパスワードが必要ですか?単にデータベースを見つけて開くために使用できるユーザーIDではないのですか? – dqhendricks

+0

@ダゴン私が持っている唯一のオプションはMySQLですが、暗号化の問題を解決できないと思います。 – chrisklaussner

答えて

1

全く異なるオプションは、プレーンテキストを決して(ディスク上でもメモリ内にも)サーバーに格納しないことです。クライアントに提供するJavaScriptを使用すると、入力したマスターパスワードに基づいて、クライアントのブラウザでデータを完全に暗号化/復号化することができます(マスターパスワードも決して送信されません)。 1人は死んでいる!

サーバーでは、暗号化されたバージョンのデータのみを保存します。データは、サイトにPOSTされるまでに暗号化されていました。データは、サイトサーバーがブラウザに送信するときに暗号化されます。

セキュリティ問題のを解決しました。 活発に悪意のあるWebサーバーはセキュリティを侵害する可能性がありますが、ユーザーが積極的に最初のページにJavaScriptを読み込んでいる場合のみです。受動的な攻撃者は(サーバーの全システムメモリを常に見ることができたとしても)セキュリティを侵害するために何もできません。

ユーザーがサイトにログインして(データサイファーテキストにアクセスできるように)、マスターパスワードと別のパスワード(または)を使用するか、JavaScriptハッシュ(塩入り!それをサーバに送信する前にマスターパスワード(これはまだハッシュを保存しておいて再度ソルトする必要があります)。

0

ダイレクト暗号化キーとしてパスワードを使用しないことを検討してください。

$_SESSION['myKey'] = md5($_POST['userName'] .$_POST['password']); //create a hash based on multiple predictable criteria 

...パスワードの代わりに$ _SESSION ['myKey']を使用してください。そうすれば、公開されていないセッション状態でキーを保持することができます。

+0

これは、マスターパスワードを保護します(表示されるウィンドウのサイズははるかに小さくなります)が、暗号化されたデータ自体のセキュリティは向上しません。 – Kitsune

+0

私は同意します。暗号化されたデータは、鍵と暗号化アルゴリズムと同じくらい安全です。つまり、私は、私の好みの方法ではなく、自分のアプリを動かすためのより良い方法としてこれを転送するだけです。私はそれがDBに入るべきだと誰もが同意します。 – AlexC

1

マスターパスワードをディスクに保存すると、暗号化は全く役に立たず、パフォーマンスが低下するだけです。

誰かがセッションの有効期間中にHDDを取り出した場合、彼は簡単にそのパスワードを使ってファイルを開くことができます。

あなたが大まかな管理を取得した場合、あなたはただ完了しました。ファイルを開く前にパスワードを保存するだけで済むからです。だから私はあなたの側に管理者がいると仮定し、あなたはシステムがうまく構成されている。

拳物はdisk encryptionです。実際にセキュリティが強化されます。もし誰かがあなたのHDDをセッションで平文のパスワードで盗んだとしても、とにかくそれを読むことはできません。

HTTPSを使用するよりも...これは、パスワードを使用して作業する場合に必須で、HTTPだけを使用している場合は、あなたのイニシアティブ全体が役に立たない必要があります。

php ...私はあなたが何かできるかどうかは分かりません。 HTTPSを使用しているときしかし、あなたがこれを行うことができます:

  • ストアのパスワード$pass
  • は一時的なランダムな暗号化キーを生成$randによって暗号化($rand
  • ストアのパスワードは
  • (私はXORを使用しました) $rand$_COOKIEに変更する
  • $_COOKIEを使用すると、すべてのリクエストでマスターパスワードが復号されます。

例:

$pass = 'iddqd'; 
$rand = 'abcde'; 
echo base64_encode($pass^$rand); // CAYHFQE= 
$_COOKIE['phrase'] = $rand; 
$_SESSION['password'] = base64_encode($pass^$rand); 
unset($pass); 

// And on every other request: 
$pass = $_COOKIE['phrase']^base64_decode($_SESSION['password']) 

付加価値は何ですか?プレーンテキストでのパスワードの保存は、認証されたディスクアクセスのみに依存します。

一時的なフレーズを生成し、それをユーザーのブラウザに保存すると(ユーザー側のみ)、認証されたディスクアクセス+ユーザー認証で生成されたCookieの値に頼ります(スプーフィングが難しいはずです)。

また、httpsを使用している場合は、各リクエストでフレーズを送信することについて心配する必要はありません(10-100-1000リクエストごとに変更することがあります)。

関連する問題