ウェブサイトに機密データを記憶させる方法を探していますが、実際にはサーバー側に保存していません。そして私はそれを行うためにHTML5 localStorage
を見ていました。これが私が見ている計画です。
localStorage
に保存します後で...
localStorage
から暗号化されたデータをフェッチするページにアクセスし、サーバーに送信します。私の考えでは、クライアントまたはサーバーのいずれかが危険にさらされ、事態は安全なままです。クライアントが危険にさらされている場合、ハッカーは解読するキーのない暗号化された文字列のみを読み取ることができます。サーバーデータベースが危険にさらされている場合、データは単にそこに格納されないため、ハッカーがアクセスすることはできません。
(明らかに、一部のタイプのサーバーハッキングでは、機密データが最初から入ってくるときにそれを読み取ることができますが、そのようなハッキングはクライアントがデータを保存しているかどうかにかかわらず機能するため、この説明には当てはまりません。仕事、私は単にここでデータストレージがどちらかの側で危険にさらされることについて話している)
しかし、私はセキュリティの専門家ではないので、自分の計画に穴があるかどうか疑問に思っていますか?ここで見逃している目立ったセキュリティの脆弱性はありますか?
これには2つの大きな問題があります。
データを特定のブラウザのインストールに関連付けます。したがって、誰かが別の場所からログインしてアクセスすることはできません。または、同じマシン上の別のブラウザでもかまいません。これは、ほとんどのWebアプリの目的に反します。また、公共のマシンはどうですか?機密データは暗号化されていますが、一般にアクセス可能なマシンに保存します。
サーバーに送り返されるデータの検証には、非常に注意が必要です。それがあなたのコントロールの外にあると、あなたはそれについて何も仮定できません。
そしてその後、サーバーはハッキングされる可能性があります(データが危険にさらされていなくても).
ウェブサイトに機密データを記憶させる方法を探していますが、実際にはサーバー側に保存していません。
サーバーを使用して暗号化されたデータを保存します。localStorageを使用する理由はありません。クライアント側でパスフレーズを使用してデータを暗号化することをお勧めします。最も弱いリンクがパスフレーズのクライアント側で入力しているため、このメソッドはクライアントをまったく保護しません。
基本的に必要なものは次のとおりです。
これでブレークがあり、すべてのcookie/localStorage/sessionStorageがクリアされます。
データがどこに保存されていても、パスフレーズなしでは誰も機密データにアクセスできません。ユーザーのみがパスフレーズを知っている必要があります。必要に応じて、ユーザーは復号化されたデータをいつでもサーバーと共有できます。ただし、サーバーが危険にさらされていることを懸念している場合(そうであるようです)、機密データの処理をクライアント側で行います。
パスフレーズはユーザーの頭にあり、暗号化されたデータはサーバーに保存されるため、機密データをハッキングする唯一の方法は、クライアントのキーボードを傍受するか、パスフレーズをブルートフォースで強制することです。
したがって、いくつかの重要な仮定があります。
次に例を示します。
# CLIENT
singlehash = keystretcher(passphrase + salt1)
ciphertext = encrypt("I stole candy", singlehash)
doublehash = fasthash(singlehash + salt2)
|
|
HTTPS(ciphertext, doublehash)
|
\ /
'
# SERVER
triplehash = fasthash(doublehash + salt3)
store(ciphertext, triplehash)
そして、クライアントが戻ってきたとき:
# CLIENT
singlehash = keystretcher(passphrase + salt1)
doublehash = fasthash(singlehash + salt2)
|
|
HTTPS(doublehash)
|
\ /
'
# SERVER
ciphertext = fetch(fasthash(doublehash + salt3))
|
|
HTTPS(ciphertext)
|
\ /
'
# CLIENT
decrypt(ciphertext, singlehash) == "I stole candy"