6

フォームを自動的に送信したり、Web サイトからデータを取得したりするプロジェクトを数多く行っています。これらのサイトの一部では、ユーザー名とパスワードによる認証が必要です。(これらのサイトには API がないため、スクリーン スクレイピングに頼っています。)

私が見たチュートリアルのほとんどは、他の POST データと同様に、ユーザー名とパスワードをソース コードに保存します。

string username = "someUserName";
string password = "somePassword";
// submit POST data...

しかし、パスワードを平文で保存することは一般的に嫌われていることは知っています。私が使用すべき別の方法はありますか?

4

6 に答える 6

1

使用するパターンは次のとおりです。

データベーステーブルには、暗号化された列があります。この列には、システム全体の長い(128ビット)ランダムな秘密鍵(通常は構成ファイルに格納されている)で暗号化されたデータが含まれます。この暗号化された列のデータには、各サードパーティサービスに使用される個別の(ランダムな)秘密鍵が含まれています。このパスワードを使用して、このサードパーティサービスに関連する認証の詳細を暗号化します。

なぜこの二重暗号化なのか?

プレーンテキストのパスワードの量を1つ(システム全体のパスワード)に減らします。このため、キー管理が簡単になります。サードパーティサービスごとに長いランダムな秘密鍵を作成して、サードパーティサービスごとに資格情報を選択的に復号化し、必要に応じてシステム間で転送できるようにします。秘密鍵の1つをデータベースの外部に保存することで、SQLインジェクション攻撃(データベースデータを取得するだけ)とバックアップ(構成ファイルは通常のバックアップデータに含まれません)の両方に関連するリスクも軽減されます。

弱点は明らかにシステム全体のパスワードです。それはどこかのメモリにある必要があります。

私は暗号研究者ではありません。上記は最適ではないと確信しています。ただし、サードパーティのサービス資格情報をプレーンテキストで保存するよりも機能し、管理しやすく、はるかに安全です。

于 2012-07-09T09:31:41.467 に答える
1

この問題を解決する必要があるスクレイピング プロジェクトがあります。私のセットアップには、2 つの別個のサーバーが含まれています。1 つ目は、ユーザー フロント エンド Web アプリです。2 つ目は、スクレイピングを処理する nodejs サーバーです。

私はopensslキーペア暗号化で暗号化を扱います。nodejs マシンのキー ペアを生成し、フロント エンド Web アプリに公開キーを渡します。ユーザーがサードパーティの資格情報を登録すると、それらの資格情報は公開鍵で暗号化され、データベースに保存されます。

Web アプリは、ユーザーの暗号化された資格情報を定期的に選択し、それらをノード サーバーに送信します。ノード サーバーでは、それらの資格情報が秘密鍵で復号化され、サード パーティでスクレイピングに使用されます。

クイック検索の後、 openssl の使用と文字列の暗号化に関するこの記事を見つけました。

これは非常に古い投稿であることは承知していますが、この問題に遭遇した次の人に役立つことを願っています.

于 2015-06-26T17:22:40.190 に答える
0

暗号化と復号化の非常に簡単な方法は、拡張された Tiny Encription Algorithm (XTEA)です。ウィキペディアの C++ コードをここに貼り付けていますが、誰でも変更できた可能性があることに注意してください。

#include <stdint.h>

/* take 64 bits of data in v[0] and v[1] and 128 bits of key[0] - key[3] */

void encipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
    unsigned int i;
    uint32_t v0=v[0], v1=v[1], sum=0, delta=0x9E3779B9;
    for (i=0; i < num_rounds; i++) {
        v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
        sum += delta;
        v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
    }
    v[0]=v0; v[1]=v1;
}

void decipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
    unsigned int i;
    uint32_t v0=v[0], v1=v[1], delta=0x9E3779B9, sum=delta*num_rounds;
    for (i=0; i < num_rounds; i++) {
        v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
        sum -= delta;
        v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
    }
    v[0]=v0; v[1]=v1;
}
于 2012-07-09T07:10:41.693 に答える
0

それを行う方法はありません。プレーンテキスト(または「可逆暗号化」)としてどこかでスクリプトに利用できる必要があります。

多くの API (たとえば、Amazon Web Services を含む) は、環境変数に認証情報を設定することを推奨していますが、これはおそらく期待できる安全性です。

それを .bash_profile に入れ、パーミッションを再確認してください。少なくとも、公開レポの github で終わらないことを確認できます。

于 2012-07-10T00:32:44.253 に答える