17

bashスクリプトを実行し、ユーザー名とパスワードを提供する必要があるPHPアプリがあります(リモートシステム用)。これらの資格情報を、PHP (Web) アプリからアクセスできる場所に保存する必要があります。論理的な場所はデータベースです (現在は MySQL ですが、不可知論的になります)。資格情報をハッシュして保存する「標準的な」方法の問題は、元に戻せないことです。データをbash スクリプトに挿入できるようにするには、資格情報を暗号化されていないクリア テキストとして取得できる必要があります

これを行うための安全な方法について何か提案はありますか?

おそらく資格情報を PKI し、結果を DB に保存すると思いました。次に、秘密鍵を使用して暗号化を解除します (PHP で実行できます)。これを行うスクリプトを Web ルートの外に保存します。

どんな考えでも大歓迎です。

4

12 に答える 12

24

まず、(できれば) 明白なことを述べると、何らかの方法でユーザー名とパスワードの保存を回避できる場合は、そうしてください。これは大きな責任であり、資格情報ストアが侵害された場合、同じユーザーが他の多くの場所にアクセスできるようになる可能性があります (パスワードの共有により)。

第 2 に、資格情報を保存する必要がある場合、元に戻せないソルト付きの暗号化ハッシュを使用してパスワードを保存するよりも好むため、データが侵害された場合、パスワードを簡単にリバース エンジニアリングすることはできず、復号化キーを保存する必要はまったくありません。

復号化可能な資格情報を保存する必要がある場合:

  1. 適切な暗号化アルゴリズムを選択してください - AES-256、3DES (日付付き)、または公開鍵暗号 (ただし、この使用には不要だと思います)。評判の良い信頼できるソースからの暗号化ソフトウェアを使用してください。自分で作成しようとしないでください。間違いを犯す可能性があります。
  2. セキュリティで保護されたランダム ジェネレーターを使用してキーを生成します。弱いランダム性は、暗号化アルゴリズムではなく、暗号化関連のセキュリティ エラーの最大の原因です。
  3. 暗号化/復号化キーをデータベースとは別に、O/S で保護されたファイルに保存し、アプリケーションのランタイム プロファイルのみがアクセスできるようにします。そうすれば、DB が (SQL インジェクションなどによって) 侵害された場合でも、通常は HDD へのアクセスが必要になるため、キーが自動的に脆弱になることはありません。お使いの O/S がプロファイルに関連付けられたファイル暗号化をサポートしている場合は、それを使用してください。これは役立つだけであり、通常は透過的です (例: NTFS 暗号化)。
  4. 実用的な場合は、キー自体をプライマリ パスワードで暗号化して保存します。これは通常、アプリを意味します。起動時にパスワードをキー入力する必要があります。HDD が侵害された場合、キー ファイルとスクリプトの両方を表示できると想定する必要があるため、スクリプトからパラメータでパスワードを指定するのは適切ではありません。
  5. 資格情報セットごとに、暗号化されたデータとともにソルト(暗号化されていない) を保存します。これは、2 つの同一のパスワードが同じ暗号テキストを生成しないように、暗号化暗号を「準備」するために使用されます。これは、パスワードが同じであることを明らかにするためです。
  6. アカウント レコードを見つけるためにユーザー名が必要ない場合 (あなたの場合はそうではありません)、ユーザー名とパスワードの両方を暗号化します。両方を暗号化する場合は、それらを 1 つの暗号化実行として暗号化します。

    userAndPass=(ユーザー+":"+パス);
    暗号化初期化();
    暗号化(塩);
    暗号化 (userAndPass);
    cipherText=encryptFinal();

    単数形のブロブを保存することで、解読しやすい短い暗号文の出現が少なくなり、ユーザー名がパスワードをさらにソルト化します。

PS: 私は PHP でプログラミングしていないので、その環境で適切な暗号化ソフトウェアについてコメントすることはできません。

于 2008-11-04T03:53:43.653 に答える
15

優れた双方向の暗号化方法を検討する必要があります。私の一般的な経験則は次のとおりです。

独自の暗号化コードを実装すると失敗します。

したがって、十分に検証された優れた実装を見つけて、それを利用してください。

おそらくここにいくつかの良い情報があります:

http://phpsec.org/library/

于 2008-11-04T02:49:58.117 に答える
3

このライブラリを確認してください:PECL gnupgは、gnupgと対話するためのメソッドを提供します。安全な公開鍵暗号化アルゴリズムを使用して、データを簡単に暗号化および復号化できます。

于 2008-11-04T02:50:52.547 に答える
2

パスワードを保存するのではなく、ホストからリモート システムへのパスワードなしの ssh 接続を使用することをお勧めします。これには、ssh キーを生成し、リモート システムのauthorized_keys ファイルに公開キーを保存します。その後、構成中に接続を確立するだけで済みます。確かにあなたの質問に完全に答えているわけではありませんが、パスワードを可逆的な形式で保存することは、セキュリティ違反への滑りやすい坂道です.

于 2008-11-04T03:43:32.347 に答える
1

開始する簡単な方法の1つは、mysqlのENCODE()およびDECODE()関数を使用することです。その下でどのアルゴリズムが使用されているかはわかりませんが、使用するのは簡単です。

INSERT INTO tbl_passwords SET encoded_pw = ENCODE('r00t', 'my-salt-string');

SELECT DECODE(encoded_pw, 'my-salt-string') FROM tbl_passwords;
于 2008-11-04T02:59:39.517 に答える
0

あなたがPKIに行くなら、そして私がそうするなら、あなたがあなたの秘密鍵を安全に守ることを確認してください!PKIによって提供される強力な暗号化は、キーと同じくらい安全です。

于 2008-11-04T02:53:33.383 に答える
0

私はあなたが目標を達成していると思います。優れたオープンな暗号化ライブラリについてはGPGをご覧ください

于 2008-11-04T02:55:44.267 に答える
0

これを行うには、ほとんど2つの方法があるようです。

1)提案したように、暗号化アルゴリズムを使用します。これらのアルゴリズムは、復号化してスクリプトの認証に使用できます。これを実現するには、PHPのMCryptライブラリを使用できます。

2)必要なセキュリティレベルとスクリプトの脆弱性レベルに応じて、スクリプトの範囲内で各ユーザーのアカウントを乗っ取るために使用できる、安全なハッシュ、キー、またはその他の推測しにくい一意の識別子を使用できます。

于 2008-11-04T02:56:44.423 に答える
0

クレデンシャルが埋め込まれた PHP スクリプトを Web アプリからその場でコンパイルする方法を調査しようと思います。

(特定の用途のために) 資格情報を要求してから、この用途専用の新しい PHP スクリプトを作成してコンパイルします。そうすれば、スクリプトは必要なことだけを実行し、「読み取り可能」になることはありません。これはこれを行うための最も安全な方法のように聞こえると思います。

Roadsend を使用してみます。http://www.roadsend.com/

于 2008-11-16T23:49:46.113 に答える
0

PHP の場合、AES 暗号化MCRYPT_RIJNDAEL 関数を介して実装されていることに注意することが重要です。PHP で利用できる非オープン実装にお金を払ってはいけません。

詳細については、使用可能な暗号について説明している PHP ページを参照してください。

于 2009-08-04T04:34:55.663 に答える
0

多くの人が述べたように、シナリオではユーザー名とパスワードを暗号化する必要があります。暗号化/復号化については、phpのmcrypt拡張機能を確認することをお勧めします。

于 2008-11-04T07:57:00.370 に答える
0

MySQL のエンコードおよびデコード関数を使用するという提案をフォローアップするためだけに、マニュアルでは、これらがどのように機能するかについて漠然としています。

暗号化の強度は、乱数発生器の性能に基づいています。短い文字列には十分です。

しかし、私が提案したいのは、組み込みの MySQL 5.0 AES 関数を代わりに使用できるということです。AES_ENCRYPT()AES_DECRYPT()

SELECT AES_ENCRYPT('secret squirrel', '12345678') AS encoded

=> ØA;J×ÍfOU»] É8

SELECT AES_DECRYPT('ØA;J×ÍfOU»] É8', '12345678') AS decoded

=> secret squirrel

これらは 128 ビット AES を使用しますが、これはほとんどの目的に対して十分に強力です。他の人がコメントしたように、ソルト値とエントロピーの高いキーを使用することは良い習慣です。

于 2008-11-24T00:46:19.647 に答える