質問

複数のアカウントから情報のアグリゲーターを実行しているクライアントがいます。データベースは、スクリプトが後で使用してそれらのWebサイトにログインしてデータを取得できる方法で、ユーザー名とパスワードを他のWebサイトに保存する必要があります。

それらを単純なテキストとして保存するのではなく、ストレージのためにハッシュできると思っています。明らかに、コードとデータベースの両方にアクセスできる場合、誰かがまだプレーンテキストバージョンにアクセスできますが、どちらかを持っている場合はそうではありません。

より良いアイデアはありますか?

役に立ちましたか?

解決

システムがユーザーにパスワードを要求する場合、そのパスワードを使用してキーを生成して、他のWebサイトのパスワードを暗号化/復号化できます。

これにより、データベースに保存したパスワードを解読できるように、ユーザーがそのパスワードを入力する必要があります。

ここでのより詳細なフロー:

  1. ユーザーは、システムにログインするときにパスワード「123456」を入力します。
  2. 「123456」パスワードのSHA256を使用して、キーを取得します: "8D969EEF6ECAD3C29A3A629280E686CF0C3F5D5A86AFF3CA12020C923ADC6C92"
  3. 「8D969 ...」を使用して、データベース内のサイトのパスワードをAESで復号化するために使用します。

これをさまざまな方法で洗練させることができます。たとえば、Sha Hashを計算する前にパスワードを塩漬けにします。

そのような塩漬けに関する実用的なサンプルとして、 マイケル 使用を提案します PBKDF2 (と hmacSHA-256 その2つのパラメーターとして、ランダム関数を擬似)。

その他の拡張機能:キーの暗号化されたバージョンを保存して、ユーザーがすべてのパスワードを再構築せずに独自のパスワードを変更できるようにします...

他のヒント

資格情報を使用するためにできることは何でも、攻撃者も同様です

難読化は実際にあなたを買いますか?時間。結局のところ、データは自分で使用するスキームと同様にあります。誰かがあなたのスキームが何であるかを理解するのは時間の問題です。これはすべて、パラノイアのレベルと、快適なリスクのレベルの評価に依存します。特に、資格情報を保存する方法は、データベースを実行しているマシンにアクセスできる人に依存する必要があります。

最終的にはゴムが道路にぶつかる必要があるので、出て行って征服してください。難読化を完全にノックしないでください。それをスマートなプラクティスと結合するようにするだけです。

アプローチと提案

アカウントごとにアプリケーションごとのAPIキーを生成し、マシンで使用する

サードパーティのアカウントからAPIキーを生成できる場合、これにより、すべての潜在的なアプリケーションをシャットダウンせずにアカウントへのアクセスを取り消すことができます。多くのサービスには、これらのタイプのAPIキー(Google、Twitter、stackexchange、Facebookなど)があります。

単に「アプリケーション」を設定し、消費者キーと秘密、およびアクセストークンとアクセスシークレットを使用します。マシンはこれらの資格情報を保存する必要があります。妥協が発生した場合、そのキーのセットを取り消す必要があります。さらに、アカウントごとのアクセス許可を指定することができます。

資格情報のセットにユーザーごとのパスワードを使用する

ユーザーがログインした場合にのみ、パスワードのセットを解除します。これを行うには、適切なハッシュスキームと、キーの前にいくつかのハッシュステップが発生する検証チェックに基づいてキーを生成します。

とにかくディスクに暗号化します

1つのキーを使用して、常に資格情報を暗号化できます。次に、保護するための鍵は1つだけです(他のすべての秘密を保護します)。その後、他の資格情報にアクセスする前に、復号化する必要があります。

システムのキーリングに秘密を保存します

Linuxで、を使用します gnome-keyring. 。次に、Simple Create-Read-Update-Deleteコールを作成して、パスワードデータベースとして扱うことができます。 GNOMEキーリングは、PKCS#11標準に基づいています。

Gnome-KeyringにはAPIがあります キーリングと取得アイテムに保存するため。

/* A callback called when the operation completes */
static void
found_password (GnomeKeyringResult res, const gchar* password, gpointer user_data)
{
  /* user_data will be the same as was passed to gnome_keyring_find_password() */
  // ... do something with the password ...
  /* Once this function returns |password| will be freed */
}

static void
find_my_password()
{
  gnome_keyring_find_password (GNOME_KEYRING_NETWORK_PASSWORD,  /* The password type */
                               found_password,                  /* callback */
                               NULL, NULL,     /* User data for callback, and destroy notify */
                               "user", "me", 
                               "server", "gnome.org",
                               NULL);
}

Windows 7+では、「暗号化されたファイルシステム」(EFS)機能を使用します。すべてのファイルは、Windowsパスワードで順番に保護されている証明書で暗号化されます。

しかし、これをあなたを誤った安心感に陥らせないでください。これが実行中のサーバーである場合、誰かがボックスにネットワークアクセスを取得した場合、キーリングデータ自体にもアクセスできます。

アクセスを付与するリモートマシンをセットアップします

公開キーと秘密鍵のペアを使用して、資格情報またはロック解除キーへのアクセスを許可するマシンをセットアップできますか?

ハッシュで

ユーザー名とパスワードをハッシュすると、それらを取り戻していません。ハッシュは、一方向関数になるように設計されています。

あなたは出来る エンコード しかし、難読化のためのデータですが、私はそれを推奨していません。

情報をハッシュすると、後でそれを取得することはできません。暗号化する場合は、キーをどこかに保存する必要があります。データベースへのアクセスを物理的に制限することを除いて、データの悪意のある使用の可能性を排除することを除いて、信頼できる方法はありません。

ハッシュは、すべての予見可能なマナーで、元のデータの使用を防ぐことができます。ただし、データを使用する必要があります。 SHA-256のような暗号化のハッシュは、計算上困難になるように設計されています(不合理なサイズのルックアップテーブルを作成することなく)見つけることができます m 与えられた H(m) どこ H お気に入りのハッシュ機能です。

暗号化のルートに行く場合は、暗号化キーを保存する必要があります。これは、妥協するか、少なくとも復号化オラクルとして使用される可能性があります。安全を確保するために、クライアントとサーバー認証証明書の両方を使用するサービスブローカーを作成できます。ただし、誰かが承認されたクライアントを妥協した場合、アカウントを妥協できる妥協と検出の間に時間の窓があります。しかし、このアプローチにより、証明書を取り消す柔軟性が得られ、侵害されたクライアントにアクセスできなくても、すぐにサーバーアクセスを拒否します。

直接接続(同じ物理スイッチ)によってのみ利用可能で、クライアントに認証され、すべてのクライアントに認証を要求するリモートサービスを設定することをお勧めします。おそらく、それができるクエリの数を制限することは、クライアントが侵害された場合に虐待を防ぐのにも役立ちます。サービスは、証明書の取り消しを確認する必要があります 毎日 リクエスト。

また、このサービスは、システムを独立して監査するのに役立つリモートロギング機能に接続する必要があります。このロギングサービスは、クライアントを再度認証し、クライアントと自己認証する必要があります。ロギングサービスはデータを受信し、ログに追加します。これは、変更や削除を許可しません。ログエントリを受信すると、タイムスタンプ付きログエントリにデジタルでサインし、監査コンテナに入ります。

これは、妥協を防ぐことは実際には不可能であるため、妥協のために可能な限り最良の回復モデルを提供するために、証明書当局が監査証明書発行のためにペーパートレイルを設定する方法に似ています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top