2009-03-05 15 views
8

私は認証を必要とするいくつかの他のAPIとサービスと統合するWebアプリケーションを持っています。私の質問は、私の認証資格情報を私のソースコードにプレーンテキストで保存するのは安全ですか? これらの資格情報を安全に保存するにはどうすればよいですか?ウェブアプリケーションのソースコードにパスワードを保存するのは安全ですか?

これはよくある問題だと思うので、回答に資格情報を確保するソリューションを見たいと思います。

コメントへの返信です。私は頻繁にPHP、Java、およびRoRの

を使用し、私はこの質問への答えのためのいくつかのより多くの票を見てみたいと思います。

+0

このアプリケーションで使用しているテクノロジを指定した場合は、より具体的な警告とアドバイスを提供できます。 – overslacked

+0

私は頻繁にPHP、Java、およびRoRを使用します – Blaine

+0

ここでの回答の多くはベストプラクティスに直接反するものです。目下の問題に精通している読者に対して[security.se]を検討してください。 –

答えて

2

は以下の通りです:

  1. ソースコード内の資格情報が、...が
  2. サニタイズが
  3. が適切に設定し、ログファイルを設定ファイルに資格情報を入れて入れないでくださいconfigの許可/所有権

おそらくプラットフォームによります...

3

推奨されません。

encrypted web.configがより適切な場所でしょう(しかしノートがWebファームで使用することはできません)

+0

しかし、それを使用するには、実行時にそれを復号化する必要はありませんか?もしそうなら、解読方法があなたのソースコードにあることを意味しないのですか?どのようにこれがより安全であるかはわかりません。 –

+0

@Andrewは解読の方法を知っていても解読に近づくことはできません。それは、鍵を保護することです。そのため、優れた暗号化アルゴリズムが一般に公開されています。 –

+0

しかし、web.configファイルを解読するためにキーがソースコードになければならないのですか? – OverloadUT

1

いいえ、そうではありません。

さらに、パスワードを1日に変更することもできますし、おそらくソースコードを変更するのが最適な方法ではないかもしれません。

1

いいえ、時には避けられないこともあります。より良いアプローチは、サービスが別の信頼に基づいて実行中のコードを暗黙的に信頼するアーキテクチャを設定することです。 (コードが実行されているマシンを信頼する、またはソフトウェアを実行しているアプリケーションサーバーを信頼するなど)

これらのいずれも利用できない場合は、独自の信頼メカニズムを作成することができますそれはアプリケーションコードから完全に分離されています。また、ローカルマシンに格納されていても、パスワードを捕食者の手に渡さないようにする方法を研究することをお勧めします。誰かが物理マシンを制御している場合は何も保護できません。

3

パスワードをパスワードに保存しない理由は、単に設定上の問題(パスワードを変更する必要があるため、アプリケーションを再構築/コンパイルしたくない)が原因です。

しかし、ソースは、セキュリティ上重要なコンテンツ(パスワード、キー、アルゴリズムなど)の「安全な」場所です。もちろん。

セキュリティ上重要な情報は適切に保護する必要がありますが、使用するファイルに関係なく基本的な真実です。設定ファイル、レジストリ設定、.javaファイル、.classファイルのいずれであろうと。

アーキテクチャの観点から言えば、それが避けられればコード内の「外部」依存関係を「ハードコード」してはいけないのと同じように、上記の理由は悪い考えです。

ただし、機密データは機密データです。 PWをソースコードファイルに埋め込むことで、そのファイルは他のソースコードファイルよりも敏感になります。これが実際の場合は、すべてのソースコードをパスワードと同じように扱います。

+0

はい。また、コンパイルした後でも、生成されたオブジェクト/実行可能コードも重要であることに言及する価値があります。 – thomasrutter

+7

"コードにPWを格納しない理由は、単に設定上の問題" - ** NO **のためです。開発者は必ずしもプロダクションパスワードを与えられるとは限りません。これはコードにパスワードを入れない大きな理由です。すべての組織があなたと同じように運営されていると想定しないでください。 –

6

ここでは、私たちのパスワードで何をしています。

$db['hostname'] = 'somehost.com' 
$db['port'] = 1234; 

$config = array(); 
include '/etc/webapp/db/config.php'; 

$db['username'] = $config['db']['username']; 
$db['password'] = $config['db']['password']; 

誰が、ウェブサーバのユーザは、あなたが開発者からユーザー名とパスワードを保護しているこの方法を/etc/webapp/db/config.phpへのアクセスを持っていません。

+5

ソースコードにアクセスできない場合は、配列からパスワードをプリントアウトするか、ファイルに格納するか、コードを実稼働環境に投入して電子メールで送信することができます。 – MaxVT

+0

はい、実際には、ユーザーのアカウントをハックして、ソースコードにアクセスできればdbパスワードを知らずにクレジットカード番号を盗むこともできます。 –

+0

ソースコード*を持っていても実稼働環境*にアクセスできない場合は、トレースを残してください。正常に運営されている組織では、開発者にコードをプロダクションするには、チェックインする必要があります。マスターにマージする前にコードレビューをしたことを他の人に知らせるようにする必要があります。 –

1

Webサーバーを制御してセキュリティ更新プログラム用に管理している場合は、ソース(好ましくは構成モジュール内)またはソースが使用する構成ファイル内にあるのが最適です。

Webサーバーを制御していない場合(たとえば、ホスティング会社が提供する共有サーバーまたは専用サーバーにある場合)、暗号化はあまり役に立ちません。アプリケーションがユーザーの介入なしに資格情報を復号化するために使用できるホストよりも、アプリケーションが特定のホスト上の資格情報を復号化できる場合(rootまたは管理者はソースコードを見て、復号ルーチンを使用して構成)。わかりやすいマネージコード(JVMや.NETなど)やサーバー上のプレーンテキスト(PHPなど)にあるWebスクリプト言語を使用している場合は、これがさらに可能性があります。

通常そうであるように、セキュリティとアクセシビリティの間にはトレードオフがあります。私はあなたが守ろうとしている脅威が何であるかを考え、必要な状況から守る手段を考え出します。セキュアにする必要があるデータを扱う場合は、データベースを公平に定期的に編集し、サイトが古くなるとすぐにファイアウォールされ、保護されたデータベースサーバーにデータをオフラインで移動する必要があります。これには、参照可能な社会保障番号、請求情報などのデータが含まれます。これはまた、課金サービスを提供するか、データストレージを保護する独自のネットワーク上のサーバーを理想的に制御したいと思うことを意味します。

それが答えを表示さ
1

Webサーバーのドキュメントルートの外側の別の設定ファイルにそれらを保存することをお勧めします。

これは、自分のパスワードを強制的に伝えるような方法で自分のコードを覆す攻撃者からの保護はしませんが、コードに直接パスワードを入れることよりも利点があります攻撃者がパスワードを含むファイルを直接ダウンロードできるようにするという点で、Webサーバの設定ミス(またはバグ/悪用)に対する懸念を排除するという点で、

-4

強力なハッシュアルゴリズム(つまりSHA-2ではなくMD5)を使用すると、誰もハッシュをまだ言及していないようですが、より安全です。

+6

別に提供する必要がある資格情報のハッシュを格納するシステムは全く役に立たない。元の資格情報を取得するためにハッシュを元に戻すことはできません。アクセスする必要があるAPIまたはデータベースは、ハッシュのみを受け入れることはありません(ハッシュを保存するのは、 。 – geoffspear

0

一つのアプローチ私はパスワードを受信するWebサービスアプリケーションではなく、クライアントのためにこれを書いているconfig.web

0

にパスワードを配置する前にパスワードを暗号化することです:あなたは誰のソースコードの誰かにハッシュされpassswordを保存する場合 ソースコードはそのハッシュで自分自身を助けることはできません。 あなたのプログラムは普通のパスワードを受け取ってハッシュし、両方のハッシュを比較します。 これは、ハッシュされたパスワードをプレーンテキストではなくデータベースに保存する理由です。たとえば、誰かがdbを盗んだり、悪意のある目的のためにそれを見ると、それらは元に戻すことができないため、すべてのユーザーのパスワードを取得することはできません。

ハッシングは1つの方法です。同じソースから同じ値を生成しますが、ハッシュからソース値を計算することはできません。

クライアントに保存:ユーザーがpassを入力したときに平文でdb/fileに保存しますが、多少難読化できますが、そのコンピュータを保持してそのパスワードを取得する人を防ぐことはできません。

関連する問題