1

Web とクライアント アプリケーションに基づくシステムを開発しています。ここで、クライアントは、PHP および Http リクエストを使用して、サーバー内のすべてのデータベース クエリを作成します。Web システムは PHP / Mysql で開発され、PC にインストールされるクライアント アプリケーションは C# で開発されます。

良い!あるフェーズでは、クライアントはログインを通じてユーザーを識別する必要があります。これは単純なタスクのように見えますが、サーバー IP はアプリケーション構成セクションで変更できます。これを考慮すると、悪意のある人は、悪意のあるサーバーの IP アドレスを入力してパスワードを盗むことでフィッシングを行うことができます。問題は、クライアントからパスワードを text/plain で送信しないことです。

現在、パスワードのハッシュに md5 を使用しており (salt を使用せず、純粋なハッシュのみ)、データベースにパスワードを保存するためだけに使用しています。

少し読んだ後、人々はもう md5 の使用を推奨しておらず、代わりに sha256 以上を使用していることに気付きました。より良いハッシュ アルゴリズムに移行して、独自のソルトを作成することを考えています。

私の知る限り、ソルトはハッシュに追加するランダムなテキストですが、それが最善の選択肢ではないと思うので、何か考えていました:

ハッシュは固定長 (アルゴリズムに応じて 32、64 など) の小文字の 16 進値に基づいているため、ハッシュの各文字の各 ASCII コードを、ロードされた固定値の合計で再生できます。リスト (配列) 例:

私が持っている: abcd

各文字の ASCII コード:

-> 97

b -> 98

c -> 99

日 -> 100

そして、次のようにリストの固定値を合計します (長さは 32 / 64 の整数に応じて異なります)。

a -> 97 + 5 = 102 => f

b -> 98 + 2 = 100 => d

c -> 99 + 7 = 106 => j

d -> 100 + 3 = 103 => g

結果は次のようになります: fdje は abcd のハッシュを置き換えます。

それがどれほど安全なのか、ハッカーが私が使用する手法を判断するのがどれほど難しいのかはわかりません。問題は、結果がハッシュと同じ長さであり、ソルトを判断するのが難しいことです。したがって、FOR歴史上どのような理由であれ、ハッカーはレインボー テーブルを使用し、ありそうな結果をキャッチします。それは間違いです。あなたはそれについてどう思いますか?

ありがとうございました...

4

3 に答える 3

1

ソルトとパスワードのソルティングが一般的にどのように意味するかを誤解している可能性があります。ソルティング パスワードは、レインボー テーブル (事前に計算された値の大きなテーブル) から「防御」するために使用されます。現在、レインボー テーブルを 1 回生成することは、ハッカーが実行しなければならない最もコストのかかる操作であり、レインボー テーブルの全体的な概念は、ハッシュの総当たり攻撃を高速化することです。

ハッシュのポイントは、ハッシュ テーブル/レインボー テーブルが 1 つのパスワードに対して生成され、別のパスワードに使用される可能性を排除することです。ソルト生成アルゴリズムが固定されている場合、攻撃者はそのアルゴリズムを特定し、それを使用して攻撃することができます。

ソルトはランダムに生成し、パスワード自体とともにプレーンテキストでどこかに保存する必要があります。また、ソルトは各パスワードに対して一意である必要があります (適切なランダム ソルト ジェネレーターを使用すれば、これはほぼ保証されます)。そうすることで、あるパスワードのレインボー テーブルを別のパスワードに対して使用できないようにすることができます。

これで作業が完了し、ほこりを払ったので、より大きな問題に移ります。それは、単純なハッシュ アルゴリズムをパスワード ストレージに使用することです。


あまり詳しくは説明しませんが、現実は次のとおりです。

GPU やその他の IC (ASIC/FGPA など) は速すぎます。のような単純なハッシュ アルゴリズムは驚異的な速度Message Digest 5Secure Hash Algorithm 1/2計算でき、パスワードは電子レンジのポップコーンのようにクラックできます。

これに対抗するために、GPU と ASIC を寄せ付けないようにするために、意図的にリソース集約型でシーケンシャル (ある程度まで並列化できない) のような専用のパスワード ストレージ/ハッシュ アルゴリズムが開発されましPBKDF#2bcryptscrypt

あなたの投稿で、あなたが PHP を使用していると述べたので、実装を選択できるこの途方もなく単純なソリューションを紹介しましょう。PHP 5.5 からは、2 つの重要な新しい関数がpassword_hash()ありpassword_verify()、困難で複雑な作業をすべて実行してくれます。

次のコードを検討してください。

$pass = 'foobar';

//Generates a password hash
$hash = password_hash($pass, PASSWORD_DEFAULT);

そのように、PHP は、推奨される (bcrypt執筆時点での) パスワード ハッシュを使用してパスワードをハッシュし、セキュリティでパスワードをソルトし、出力を保存用の単一の文字列にフォーマットします。

指定したパスワードが正しいかどうかを確認するには:

$pass_to_verify = ...

//$hash variable retrieved from the previous password_hash() function.
if(password_verify($pass_to_verify, $hash)){
    //Password is correct
}else{
    //Password is not correct
}

これら 2 つの関数を使用すると、(PHP の関係者が混乱しない限り) パスワードがブルート フォースから保護されていることが保証されます。多くの人が言っていることを繰り返します:暗号とハッシュアルゴリズムの概念全体を完全に認識していない限り、独自の暗号を実装しないでください(その場合、おそらく SO に投稿することさえないでしょう)。

于 2013-11-10T10:42:06.470 に答える