11

私のアプリケーションは、ユーザー名とパスワードを使用して FTP サーバーに接続します。パスワードを暗号化および復号化するための暗号化ルーチンを作成できますが、ソース コードと暗号化されたパスワードにアクセスできれば、誰でもパスワードを復号化できます。

すべての人間がアプリケーションで使用されるパスワード全体を知られないようにする簡単な方法はありますか? (パスワードの一部を複数人で知っていても大丈夫だと思います。)

編集: FTP が安全でないことはわかっています。理想的には、ユーザー名とパスワードが必要なあらゆる状況 (データベース接続など) で機能する手法が必要です。

4

15 に答える 15

16

いいえ。アプリユーザーがしなければならないのは、自分のネットワークトラフィックをスニッフィングすることだけです(Wiresharkなどで簡単に行えます)。

各ユーザーにある種の一意のトークンを与える方法が本当に必要です。

編集-詳細:

アプリケーションのすべてのコピーで同じ「秘密の」ログイン情報に依存するシステムは、設計上欠陥があります。物事を安全に保つために、アプリのすべてのインストールには、サーバーでの認証に使用する一意のシークレットが必要です。それをどのように達成するかは、アプリのライセンス/配布方法によって異なります。これが私がそれをする方法です。(SSL接続を介してすべての通信を実行します)。

  1. アプリが初めて起動され、認証情報が保存されていないことがわかります。
  2. アプリは、登録コード、電子メールアドレス、および/またはユーザーを識別したい場合にプロンプ​​トを表示します。
  3. アプリは公開鍵と秘密鍵のペアを生成し、手順2のID情報を含む公開鍵をサーバーに送信します。
  4. サーバーはキーを記憶し、それを使用して今後アプリを識別します。

別のステップ3は次のとおりです。アプリはステップ2から情報を送信し、サーバーは情報+ソルトのハッシュ署名を送り返します。ハッシュ署名がアプリのキーになりました。

重要なことは、すべてのユーザー間で共有される「秘密」がないということです。

于 2008-10-09T18:24:13.383 に答える
2

パスワードまたはキーにアクセスできる人が少なくとも1人いる必要がありますか?私たちの開発者は本番サーバーにアクセスできません。これにより、パスワードを知ることができるシステム担当者は、ソフトウェアを展開するときにパスワードを設定できます。

ソフトウェアを構成可能にコーディングしてから、開発者を締め出します。

于 2008-10-09T18:24:27.050 に答える
2

いいえ、簡単な方法はありません。必要なだけ難読化できますが、アプリケーションがプレーンテキストのパスワードをいつでも利用できる場合は、独自のソースコード以外のリソースにアクセスする必要がなく、次の方法でパスワードを抽出できます。同じソースコードにアクセスできるすべての人間。

FTPのようなプロトコルを使用する場合、とにかく全体の演習は少し無意味です。Wiresharkをダウンロードできる人なら誰でも、数秒でネットワークネットワークから資格情報を盗聴できます。

問題を適切に解決するための手順:

  • SFTPやFTP+SSLなどの安全なプロトコルに切り替えます
  • パスワードの代わりに公開鍵認証を使用します(SFTPとFTP + SSLの両方がこれをサポートしますが、方法は少し異なります)
  • ログインに必要な秘密鍵/証明書のコピー(できれば一意であるため、資格情報の共有を検出し、侵害されたアカウントを無効にできる)をソフトウェアの各展開に提供します
  • 実行しているプラ​​ットフォームで可能な限り最も安全な方法で秘密鍵/証明書を保存します。Windowsでは、これは証明書ストアを使用することを意味します。優れた紹介については、このMSDNマガジンの記事を参照してください。

編集(元の質問の変更後):私の回答の最初の段落は、データベースのパスワードなどに等しく適用されます。これらの状況のソリューションは、さらにプラットフォーム固有になります。特定のデータベース/その他/OSの組み合わせが安全なログオンをサポートしていない場合、実行できることはそれほど多くありません。

例:Windowsでは、SQL ServerはNTLM認証をサポートしており、既存のWindowsアカウントに基づいてデータベースアクセス権を設定できるため、バイパスが比較的難しいパスワードの自動安全な保存と送信が可能になります。NTLM認証を使用できない場合、(.NET Frameworkで推奨される方法として)実行できる最善の方法は、マシン固有のキーで暗号化されたパスワードを構成ファイルに保存することです。ただし、ある時点でプレーンテキストのパスワードが必要になるため、この「保護」はデバッガーを使用して簡単にバイパスされます。

于 2008-10-09T18:35:24.563 に答える
2

ここで私の古い質問と回答を参照できます。Winformsアプリケーションにパスワードを保存するには? . でも、それ以外のアイデアもお待ちしております。

于 2008-10-09T18:22:17.973 に答える
1

私は多くの方法を試しましたが、この場合は暗号化が方法ではないと思います。代わりに、パスワードをweb.config / app.config / etcやWindowsレジストリなどの構成ファイルに保存するか、/ etcまたは開発者が(実稼働環境で)アクセスできないその他の場所にファイルを保存します。 、 しかし、あなたは行います。

于 2008-10-09T18:23:08.643 に答える
1

彼がしようとしていることは、パラノイア、役に立たないパラノイアの主な原因です。データを安全に保つために雇用されている人を信頼できない場合は、他の人を雇ってください。

ここでの問題はソフトウェアで解決できるものではなく、人的資源の問題です。たとえば、それぞれがパスワードの一部を持っている 2 人のユーザーは、いずれお互いを見つけることができます。この場合、2 人のユーザーはパスワード全体を知っていることになります。

そして、あなた自身が指摘しているように、パスワードを誰も知らないようにしたとしても(もちろん、最初にサーバーに実際にパスワードを設定する人を除いて...)、ネットワーク経由で傍受するのは簡単です.

これは、「誰もコンピューターにアクセスできないようにしたい」という同じ古い問題であり、コンピューターをすべてから取り外し、スチール製の箱に溶接し、その上にコンクリートを流し込み、その物体を深宇宙に撃つことによってのみ行うことができます.

于 2010-10-14T13:00:25.347 に答える
0

実際の答えはノーです。標準のFTPクライアントサーバー通信は、実際には暗号化されていない形式でネットワークを介してユーザー名とパスワードを渡します。したがって、アプリケーション内の実際のデータを暗号化するために何らかのスキームを使用しようとしても、Etherealのコピーを持っている人は誰でもそれを盗聴することができます。

于 2008-10-09T18:23:36.117 に答える
0

どの種類の暗号化を使用する場合でも、アプリがftpに接続する前に、パスワードを暗号化する必要があります。すべてのユーザーがデバッガーでアプリを実行し、その時点までトレースしてから、メモリからパスワードを選択できます。このように、シナリオの完全なセキュリティは不可能です。

そうは言っても、実行時に読み取られる構成ファイルに暗号化されたパスワードを入れることができます。開発者が別のftpに接続し(または後で削除される別のアカウントを使用して)、アプリを展開するときに保護する暗号化されたパスワードを構成ファイルに入れます。

于 2008-10-09T18:38:49.750 に答える
0

これを行う1つの方法は、サーバー上でアプリケーションをホストすることです。パスワードがサーバーの制限された領域に保存されている場合、アプリケーションを使用しているユーザーはパスワードにアクセスできません。実際、提供されたインターフェイスを介する場合を除いて、アプリケーションにアクセスすることはできません。これが、Webアプリが非常に人気になっている理由の1つです。

この特定のケースでは、ソースコードがまだ利用可能であり、パスワードがソースコードと一緒に保存されておらず、安全なサーバーにのみ保存されており、アプリケーションをホストしているアカウントからのみアクセスできることを確認する必要があります。サーバー。

于 2008-10-09T18:39:26.707 に答える
0

環境によっては、この回答が役立つ場合があります。ただし、最終的には、人々がプロセスに関与しているため、答えは「血まみれではない」です。

  • ユーザー名とパスワードの組み合わせを構成ファイルに保存します。
  • あるユーザー名/パスワードでステージング サーバーをセットアップし、別のユーザー名/パスワードでテスト サーバーをセットアップし、さらに別のユーザー名/パスワードで製品サーバーをセットアップします。
  • 設定ファイルのパスワード (プログラマーなら誰でも知っている) は、ステージング サーバー用です。テスト グループに与えられたユーザー名/パスワードは、テスト サーバー用です。
  • 本番/テスト サーバーのユーザー名/パスワードが異なることを確認してください。
  • 製品と一緒に正しい本番ユーザー名/パスワードを使用して構成ファイルを配布します。
于 2008-10-14T00:46:07.530 に答える
0

本質的に、いいえ。困難にすることはできますが、他人のコンピュータでコードを実行するスキームは、攻撃を受ける可能性があります。FTP サーバーは、アプリケーションから必要なものをハッキングした誰かではなくアプリケーションと通信していることをどのように認識しますか。

于 2008-10-09T18:22:33.543 に答える
0

いいえ、これを安全に行う方法はありません。いずれにせよ、ftp は安全なプロトコルではないため、ユーザー名とパスワードを確認するのにソース コードは必要なく、ローカル ネットワークのスニファにすぎません。ssh トンネリングを使用することでこの問題を回避できますが、ソース コードを出荷すると、アクセス権を持つユーザーがそこからユーザー名とパスワードを取得することは常に簡単になります。ソースがなくても、安全なプロトコルがあっても、逆アセンブラー/デバッガーと空き時間を持つ専用の攻撃者は、実行可能ファイルからこの情報を取得できます。ユーザー名とパスワードを安全にする必要がある場合は、難読化されていてもコードに含めないでください。

于 2008-10-09T18:22:39.377 に答える
0

アイデアを投げかけるだけです:

  1. パスワードをバイナリで、割り当てた場所に保存します。
  2. パスワードは時間(日)などに基づいて変更できますが、コードを実行するとパスワードも取得できます。
  3. 多分公開鍵/秘密鍵で何かをするでしょう。この認証部分のためだけにサーバー.おそらく、業界で受け入れられている既知の方法がもっとあります..

ちなみにftpは安全ではありません。クリア テキストの送信を避けるには、sftp または ftps が必要です。

于 2008-10-09T19:21:44.033 に答える
0

「いいえ」の答えはすでに十分にあると思います。私は (あなたの質問に直接答えることなく) 同様の問題が Web/アプリケーション サーバーの jdbc-datasources で (ほぼ) 解決されたことを指摘したいと思います: これらはリソースであり、基本的に接続ファクトリであり、既に接続されているデータベースを提供します。アプリケーションが名前やパスワードなどの接続設定について心配する必要なく、接続を確立できます。接続は appserver によって確立され、appserver も構成ファイルを読み取り、パスワードを認識します。

他の環境(または適用可能性)での語彙はわかりませんが、言語にとらわれず、質問に直接答えていないので、例をJavaに限定しても問題ないと思います。

ftp 接続を提供する同様の抽象化を見つけたり書いたりすると、ソースコードを持つプログラマーがパスワードを知ることができなくなる可能性があります (「コンテナー」によって提供される接続オブジェクトのみが使用されるため)。ただし、盗聴や、実行中のアプリケーションへのデバッグ アクセス権を持つ人々に対しては役に立ちません。

直接答えず、厳密な「はい」でなくても、これが役立つことを願っています;-)

于 2008-10-09T19:23:25.137 に答える
0

何が必要かわからない...プライベートパスワードをハードコーディングする方法を探している場合は、私のコメントを却下してください。

しかし、パスワードを保存する方法を探しているなら...

あなたが探しているのは、パスワード自体ではなく、パスワードのハッシュを保存することだと思います。そうすれば、プログラマーがパスワード チェック アルゴリズムとデータベースからのパスワード ハッシュを持っていても、パスワードを解読することはできません。

于 2008-10-14T01:04:32.003 に答える