質問

データベースのパスワードを構成ファイルに保存する必要があります。明らかな理由から、それらを暗号化したいと考えています (できれば AES で)。歴史的に成長した (URGH!) ソース コードが 10,000 行を超える既存のプロジェクトに簡単に導入できる Delphi 実装を知っている人はいますか?

説明:簡単とは、ユニットをプロジェクトに追加し、最大値を追加することを意味します。構成ファイルが読み取られて完了する 5 行のコード。15 分以上かかることはありません。

別の説明:パスワードは、アプリケーションのユーザー管理スキームをサポートするためではなく、データベースへの接続を作成するために必要です。したがって、ハッシュを使用しても役に立ちません。パスワードが有効かどうかは、アプリではなく DB エンジンがチェックします。

役に立ちましたか?

解決

私はデイヴィッド・バートン氏の次の推薦をします。 DCPCrypt ライブラリ. 。私はいくつかのプロジェクトでこれを使用して成功しました。使用例を読んだら 15 分もかかりません。MITライセンスを使用しているため、商用プロジェクトなどで自由に使用できます。DCPCrypt は、AES である Rijndael を含む多くのアルゴリズムを実装しています。

グーグルで検索できるスタンドアロン (単一ユニット) 実装も多数あります。問題は、特定のライブラリの正しさを自分で検証する準備ができていない限り、どれを信頼できるかです。

他のヒント

通常の認証目的では、パスワードを保存する必要はなく、ユーザーが入力したパスワードが正しいかどうかを確認するだけで済みます。その場合は、ハッシュ署名を保存するだけで済みます (例:MD5) を代わりに使用し、入力されたパスワードの署名と比較します。2 つの署名が一致する場合、入力されたパスワードは正しいです。

誰かがあなたの「マスター」パスワードを入手すると、すべてのユーザーのパスワードを取得できるため、暗号化されたパスワードを保存することは危険である可能性があります。

MD5 を使用する場合は、Delphi に付属の MessageDigest_5.pas を使用できます (少なくとも、私の Delphi 2007 のコピーには含まれています)。Delphi ソース コードを使用した他の実装も選択できます。

Turbopower LockBox は暗号化用の優れたライブラリだと思います。

http://sourceforge.net/projects/tplockbox/

あなたの用途には大きすぎるかどうかはわかりませんが、使い方は非常に簡単で、5 行のコードで文字列を暗号化できます。それはすべて例にあります。

トンドレイ氏は正しいアプローチをとっています。可逆暗号を使用してパスワードを保存しないでください。正しく指摘されているように、「マスター」キーが侵害された場合、システム全体が侵害されます。MD5 などの非可逆ハッシュを使用すると、はるかに安全であり、ハッシュ値をクリア テキストとして保存できます。入力したパスワードをハッシュし、保存されているハッシュと比較するだけです。

私はいつも Turbopower Lockbox を使用しています。うまく機能し、とても使いやすいです。実際、私はまったく同じ目的でこれを使用し、パスワードを構成テキストファイルに保存します。

http://sourceforge.net/projects/tplockbox/

TurboPower LockBox 3 (http://lockbox.seanbdurkin.id.au/) は自動ソルティングを使用します。点滴には塩が加えられていないため、Barton の DCPCrypt はお勧めしません。状況によっては、これは非常に重大なセキュリティ上の欠陥となります。

以前のコメントとは異なり、LB3 の AES 実装は標準に完全に準拠しています。

これを使ったことがある 図書館, 、本当に簡単に追加できます。しかし ウィキのショー さらにいくつかの解決策があります。

暗号化したとしても、復号化キーと暗号化されたパスワードの両方が実行可能ファイルに含まれるように思えます。これは、単に隠蔽することによるセキュリティでは決してないことを意味します。誰でも復号化キーと暗号化されたパスワードを取得し、生のパスワードを生成できます。

必要なのは一方向ハッシュです。

ただの思い出です。

他の暗号化ライブラリと相互運用する必要がない場合は、DCP または LockBox がその役割を果たします。

しかし

rinjdael 仕様に完全に準拠する必要がある場合は、無料コンポーネントのことは忘れてください。ほとんどの場合、それらはちょっと「ひどい」ものです。

他の人が指摘しているように、認証目的では、可逆暗号化を使用してパスワードを保存することは避けるべきです。パスワード ハッシュを保存し、ユーザーが指定したパスワードのハッシュを保存したハッシュと照合することのみを行ってください。ただし、このアプローチには次のような欠点があります。に対して脆弱です レインボーテーブル 攻撃者がパスワード ストア データベースを入手した場合に備えて、

事前に選択した (秘密の) ソルト値とパスワードのハッシュを保存する必要があります。つまり、ソルトとパスワードを連結し、結果をハッシュし、このハッシュを保存します。認証するときも同じことを行います。ソルト値とユーザーが指定したパスワードを連結してハッシュし、等しいかどうかを確認します。これにより、レインボーテーブル攻撃が不可能になります。

もちろん、ユーザーがネットワーク経由でパスワードを送信する場合 (たとえば、Web アプリケーションやクライアントサーバー アプリケーションで作業している場合)、パスワードをクリア テキストで送信すべきではありません。そのため、ハッシュ(salt +パスワード) を保存して hash(salt + hash(password)) と照合し、クライアントにユーザー指定のパスワードを事前ハッシュしてネットワーク経由で送信させる必要があります。これにより、ユーザーが (多くの場合と同様に) 同じパスワードを複数の目的で再使用した場合に備えて、ユーザーのパスワードも保護されます。

何らかの塩を使用することをお勧めします。crypt(パスワード) を構成ファイルに保存せず、このストアの代わりに crypt(salt + パスワード) を保存します。「ソルト」として、データベースを開くために必要なものを使用できます。データベース名+ユーザー名。crypt 関数の場合、AES、Idea、DES などのよく知られたアルゴリズム、または各バイトを他の文字列のバイトと xor するような単純なものを使用できます。その文字列がキーになります。解決方法をさらに変えるために、いくつかのランダムなバイトを使用し、それらを保存することができます。

したがって、保存するには:

  1. init_str := ランダムな 5 バイト
  2. new_password := ソルト + パスワード // ソルト := db_name + user_name
  3. crypted_pa​​ssword = xor_bytes(init_str + new_password, '私のキーフレーズ')
  4. crypted_pa​​ssword := init_str + crypted_pa​​ssword
  5. crypted_pa​​ssword を構成に保存します。これは 16 進化または Base64 化できるバイトになるためです。

そして接続するには:

  1. 構成から読み取られたデータを init_str と crypted_pa​​ssword に分割します
  2. new_password = xor_bytes(init_str + crypted_pa​​ssword, '私のキーフレーズ')
  3. パスワード := 新しいパスワードから (db_name + user_name) を削除します

Nick の言うことはもちろん正しいです。セキュリティ ソリューションの実装に 15 分すべてを費やしたいと言うのは、自分が何をしているのかわかっていると思います。(より良い) 方法を選択する場合、DCPCrypt ライブラリは多数のハッシュ アルゴリズムも実装します。

いくつかの解決策:

  • パスワードは一切保存しないでください。データベースが統合認証をサポートしている場合は、それを使用してください。このプロセスは、特定のIDを使用して実行するように設定し、データベースによって自動的に認証されるように設定できます
  • Windows証明書ストアと証明書を使用して、パスワードを暗号化します。アプリケーションでパスワードを暗号化するために使用されるキーを保存する場合、とにかくセキュリティがほとんどありません。キーも保護する必要があります。

現在のユーザーのみがアクセスできる場所にも保存する必要があります。

基本的にこれを行うには 2 つの方法があります。

  1. に保管してください EFS暗号化ファイル.
  2. に保管してください。 安全なローカルストレージ.

Internet Explorerは2を使用します。ただし、ローカルにアクセスできれば、両方とも復号化できます。と2。適切なマスターキーとアルゴリズムがある場合 (たとえば、 iepv Internet Explorer のパスワードを取得できます)。

それで:
可能であれば、パスワードを保存しないでください。
まず代替手段 (Windows 認証、ディレクトリ サービスなど) を探します。

--ジェローン

シンプルだがほとんどのアプリケーションにとって十分強力なシステムが、この Embarcadero のデモで提供されます。https://edn.embarcadero.com/article/28325

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top