3

会社の電子メール アカウントを使用してクライアントに電子メールを送信するアプリケーションを作成しているという厄介な状況にあります。ここでの問題は、サーバー上のメール サービスがそのアカウントから電子メールを送信するようにするには、アカウントのパスワードが必要なことです。特に重要な電子メール アカウントに使用されるパスワードは、プレーン テキストで保存してはならないことを私は知っています。ここでのジレンマは、プログラムが電子メールを送信するために実際の平文のパスワードを持っている必要があるため、プログラムがアクセスできる場所に保存する必要があることです。このプログラムは MySQL データベースを使用して情報を保存するため、次の 3 つのオプションが考えられます。

1) パスワードをプログラムのメモリ、つまりプライベートな最終文字列フィールドに保存します。

2) パスワードを読み取ることができるサーバー上のファイル

3) MySQL データベースのどこか。

1 が最も安全なオプションだと思いますが、この種の状況を処理して、パスワードが悪用されるリスクを最小限に抑えるためのアイデアを持っている人はいますか? アドバイスありがとうございます!

4

3 に答える 3

4

SMTP が認証を必要としないことを指摘するコメントは正しいです。とはいえ、指定した3 つのオプションはすべて、サーバーがコモディティ ハードウェアとソフトウェアを使用していると仮定すると、安全ではありません。元の命令には従いませんが、それぞれが安全でない理由を示します。

2) パスワードを読み取ることができるサーバー上のファイル

3) MySQL データベースのどこか。

誰かがサーバーを盗んだ場合はどうなりますか? 次に、ファイルまたはデータベースを開いてパスワードを読み取るだけで、社内のすべての重要な情報にすぐにアクセスできます。そのため、昼夜を問わずサーバーを武装した警備員が取り囲んでいない限り、これはすでにかなり安全ではありません.

しかし、それは悪化します。攻撃に対して完全に無防備なコンピューター システムはありません。過去数年間に広く公表されたいくつかの攻撃 (たとえば、Sony の PlayStation Network) では、攻撃者が物理的なアクセスなしにディスク ファイルやデータベースの内容にアクセスできることが示されています。さらに、あなたの質問から、問題のサーバーは外界からのパケット (HTTP 要求、受信メールなど) を受け入れるように意図されているように思われ、それが攻撃面を後押しします。

1) パスワードをプログラムのメモリ、つまり非公開の最終文字列フィールドに保存します。

これは魅力的ですが、オプション 2 やオプション 3 よりもさらに悪質です。たとえば、Java コンパイラによって生成された .class ファイルにプライベートの最終文字列フィールドが格納されるため、このオプションを使用すると、暗号化されていないパスワードが既に格納されています。サーバーのハードドライブ上。オプション 2 または 3 のようにサーバーを侵害した後、攻撃者javapは .class ファイルからプレーンテキストのパスワードを取得するために実行できます。

ただし、このアプローチにより、攻撃対象領域がさらに広がります。パスワードがソース コードの一部として保存されている場合、コードに取り組んでいるすべての開発者が突然パスワードを利用できるようになります。最小特権の原則の下では、開発者は余分なパスワードを知ってはいけません。これには非常に正当な理由があります。開発者のマシンのいずれかが外部から盗まれたり侵害されたりした場合、攻撃者は侵害されたマシンのハード ドライブを調べて、平文のパスワードを取得できます。次に、ソース管理です。ソース管理の非常に重要な利点の 1 つは、コードの以前のバージョンを検査できることです。したがって、将来的に安全な方法に切り替えたとしても、パスワードがソース管理に入ったことがある場合、ソース管理サーバーは潜在的な攻撃ポイントになります。

これらすべての要因を総合すると、たとえ HTTP/メール サーバーのセキュリティが一流であっても、オプション 1 では攻撃面が非常に大きくなり、HTTP/メール サーバーのセキュリティは実際には役に立たないことがわかります。


追加の詳細: 冒頭で、「サーバーが市販のハードウェアとソフトウェアを使用していると仮定して」指定しました。市販のハードウェアとソフトウェアを使用していない場合は、読み取り専用ストレージから起動し、暗号化されたデータベースのみを使用して、起動のたびに復号化キーを提供する必要があるなどのことを行うことができます。その後、復号化された情報はメモリにのみ存在し、ディスクに書き込まれることはありません。このようにして、サーバーが盗まれた場合、攻撃者はサーバーのプラグを抜く必要があるため、これまでメモリにしか存在しなかった復号化された情報がすべて失われます。この種のセットアップは、Kerberos KDC (セキュリティを強化するためにサーバーをロックされたボックスに入れる) に使用されることがありますが、それ以外ではめったに使用されません。費用。

于 2012-04-13T00:28:33.653 に答える
1

パスワードを安全に保つことに真剣に取り組んでいる場合は、パスワードをエンコードして 2 つまたは 3 つに入れることができます。パスワードを使用する必要がある場合は、プログラムでパスワードをデコードし、プレーンな文字列としてメモリに保存するだけです。

元。

String encodedUrl = URLEncoder.encode(url,"UTF-8"); 

String decodedUrl = URLDecoder.decode(url,"UTF-8");

于 2012-04-12T21:42:01.903 に答える
1

これは一般的な問題です。挿入に AES 暗号化を適用して、MYSQL の blob フィールドにパスワードを保存できます。便利な復号化のために、Java で key_string を使用および保持します。

MYSQL 構文:

AES_ENCRYPT(str,key_str)

AES_DECRYPT(crypt_str,key_str)

挿入は次のようになります。

INSERT INTO t VALUES (1,AES_ENCRYPT('password','encryption_key'));

キーを使用して、出てくる復号化を行います

SELECT AES_DECRYPT(password, 'encryption_key') AS unencrypted FROM t

そのため、暗号化キーが必要になりますが、パスワードをプレーン テキストとしてアプリケーションに保存することはありません。データベースへの接続は安全でなければなりません。ログが問題になる場合があります。

または、ストアド プロシージャを使用してキーを出し入れすることも、サーバー側でキーを暗号化し、暗号化後に挿入/取得することもできます。

于 2012-04-12T23:51:34.310 に答える