2012-01-24 15 views
7

私はユーザーが自分の個人データを送信するウェブサイトを持っています。私はこれらのデータをaes-256で暗号化することを考えています。そのパスワードはその暗号化の鍵として使用され、暗号化されたデータをmysqlデータベースに保存します。ユーザーは、私が暗号化されたデータ暗号化の後にaes-256キーを変更するには?

のキーを変更する方法を自分のパスワードを変更した場合..

は今、私は再びそれを暗号化し、古いキーでそのデータを復号化し、データベースからすべてのデータを収集する必要があります新しい鍵?

答えて

13

パスワードを変更したときに、すべてのユーザーのデータを再暗号化する必要はありません。

ユーザーのデータを暗号化する秘密鍵を生成します。これを「コンテンツ暗号化キー」と呼んでください。ユーザーのパスワードからキーを派生させます。これを「キー暗号化キー」と呼んでください。 「キー暗号化キー」を使用して「コンテンツ暗号化キー」を暗号化します。暗号化された鍵を、鍵と鍵の導出に使用される反復回数と一緒に格納します。

パスワードを変更する場合は、古いパスワードでコンテンツ暗号化キーを復号化し、新しいパスワードから派生したキーを使用して再暗号化します。新しいパスワードの新しい塩を選択し、新しい暗号化されたキーと一緒に保存するようにしてください。

コンテンツの暗号化キーは巨大なスペースからランダムに選択されるため、暗号化する際にECBを暗号モードとして安全に使用できます。

saltを使用していても、途切れていないアルゴリズムを使用していても、単純にパスワードをハッシュしないでください。何千回もハッシング操作を繰り返す必要があります。ほとんどのプラットフォームでこれを(正しく)実行するためのライブラリがあります。パスワードから秘密鍵を作成するには、鍵導出アルゴリズム(PKCS#5のPBKDF2)を使用します。

この概念は、以下の考慮すべきthe draft for password-based S/MIME encryption.

+0

暗号化された鍵はどこに保存されますか?アプリケーションサーバー上のメモリ内、またはデータベースサーバー上の物理ストレージ内にありますか? – dimiguel

+0

@dimgl信頼できる永続的なストレージにバックアップを保存しています。確かに記憶にない。内容が停電によって取り返しがつかなくなるかどうか気にしない限り、 – erickson

0

これは愚かです。

AESは256ビットの鍵を使用しているため、鍵のパスワードを使用すると言えば、鍵サイズの要件とほとんど同じくらい長くはなりません。

+0

パスワードをハッシュして256バイトにしてから、暗号化に使用します –

+0

キーを作成するためのフォーマットは何ですか? –

3

まず、パスワードをAESキーとして使用しないでください。暗号のハッシュ(MD5ではなく)のパスワード+塩(これはハッシュではなく塩を保存する)のようなものかもしれません。

あなたができることの1つは、各ユーザーのファイルをランダムなキーで暗号化し、そのキーをハッシュ+暗号化されたパスワードで暗号化することです。ユーザーがパスワードを変更した場合は、キーを再暗号化するだけで済みます。

2

一つの可能​​性は、データへのアクセスを得るために使用されるキーからのデータを暗号化するために使用されるキーを切り離します。注意深く行うことで、ユーザーはデータベース内のレコードを1つだけ変更しながら、必要に応じて頻繁にパスワードを変更することができます。これとは別に、データを暗号化しているキーの変更をスケジュールすることができます。

どのように動作しますか?

  • あなたがランダムに生成された鍵、K U、DとユーザUのデータDを暗号化します。
  • あなたはランダム塩、(あなたがの記録を保存)S1 Uと、ユーザーのパスワードP1 U(から生成された別のキーK1 U、KとキーK U、Dを暗号化しますあなたは追跡しても、追跡しなくてもよい)。暗号化されたキーは、E1 Uです。
  • ユーザーがデータにアクセスしたいときに、S1 UとK1 U、Kを保存します。
  • ユーザーUが自分のデータにアクセスする場合、彼らは自分のパスワード、P1 Uをご提供し、あなたはS1 Uを検索し、そのデータからK1 U、Kを再生成し、E1を復号化するためにそれを使用 Uとなり、もう一度K U、Dとなり、実際のデータを復号化します。
  • 与えられたパスワードが正しいことを検出できるので、ユーザーが間違ったパスワードを入力した場合にバイナリの不調を吐くことはありません。

このレベルのインダイレクションの利点は、ユーザーがパスワードを変更したいときです。これに類似したテクニックを使用しない場合は、古いパスワードと新しいパスワードを取得して検証し、古いパスワードですべてのデータを復号化し、新しいパスワードですべてを再暗号化する必要があります。間接的なレベルで

、あなたはまだ自分の古いパスワード(P1 U)のために、ユーザとその新しいパスワード(P2 U)を求め、それらを検証していますが、唯一のE1 Uを復号化する必要があるとSUと新しいパスワードP2 U、Kと新しいパスワードPUから新しい鍵K2 Uを再暗号化します。暗号化されたデータに触れる必要はありません。間接的なレベルで

、システムSは、システムのパスワードで暗号化されたデータ鍵K U、D、第二暗号化されたコピーを維持することができます。データを暗号化するために使用される鍵を変更する必要があるかまたは望ましい場合、システムは暗号化された鍵のコピーを使用してそれを行うことができます。ユーザーがキーに最後に記録したキーの記録を保持することができるので、ユーザーがデータを見に戻ったときに、保存されたキーK2 U、Dを変更することができますパスワードは残ります(残りの時間はありません)。

これはKevin Kenanの "Cryptography in the Database: The Last Line of Defense"のアイデアの一部に軽いバリエーションです。 Kn U、Kのキーは、KEK(Key-Encrypting Key)の例です。また、暗号化されたデータの管理に役立つ主要なファミリーについても読むことができます。

関連する問題