1

現在、私はPHPをいじっているだけですが、拡張したいアイデアに出くわし、あなたの意見でそれがどれほど安全であるか、実用に耐えられるように改善するにはどうすればよいかを知る必要があります.

これは、パスワードをデータベースに保存する方法です。

プレーンテキストパスワード -> ハッシュパスワード (私はワールプールを使用しますが、実際にはどの方法でも機能します) -> ハッシュされたパスワードをシャッフル/スクランブルします (str_shuffle() 関数を使用)。

ユーザーのパスワードをこのようにデータベースに保存することで、データベースが侵害された場合に、攻撃者がデータベース内の壊れたパスワード ハッシュを元に戻せないようにします。(ある意味で、ハッシュであるランダムなテキストをどのように逆にすることができるのでしょうか?-同じ文字を共有するハッシュのリストを比較することで、可能性のリストを作成できると確信しています。)

ログインフォームに入力したユーザーのパスワードが正しいかどうかを確認する方法 (データベース内の壊れたハッシュと比較して) は、両方の文字列/パスワードで個々の文字 + 数字 (af & 0-9) を数えて、一致する場合は、正しくログインしていると思います。

繰り返しになりますが、これがあなたの意見でどの程度安全であるか、また実用に耐えられるようにするにはどうすれば改善できるかを知りたいです。(可能であれば。)また、「可逆」ハッシュを回避するために最善を尽くしたいと思います。(つまり、パスワードが一致することを保証する独自の方法を作成するというアイデアです。攻撃者がデータベース内のパスワードを元に戻すことが不可能になることを完全に保証するために、最善の推測の仮定に近づけたいと考えています。

& はい、これがばかげていることはわかっています。セキュリティ上の欠陥を修正するのではなく、さらに多くの欠陥を引き起こす可能性が高いからです。しかし、これは私がふざけているだけであり、おそらくそれを実用的にしたいと考えています。


他の情報:

1) パスワードは一意のソルトで保存されます (1 つのアカウントが同じソルトを共有するわけではありません)。

2) パスワード ソルトは常に変更されます (ユーザー アカウントでログインが成功するたびに、データベース内のユーザー ソルトが変更されます。データベース内のハッシュを変更するためにこれを行い、パスワードの衝突の頻度を減らします (願わくば) ) & また、不要なユーザーが同じ間違ったパスワードを何度も使用してログインするのを防ぐためです (パスワードを見つけた場合、これを達成する唯一の方法は、ログイン システムが脆弱であるブルートフォースまたは「推測」することです)。

パスワードの衝突とは、「hello」と「blue」という単語がまったく同じ文字数を共有している可能性がわずかにあることを意味します (説明したように、個々の文字と数字を数えて比較し、正しいパスワードであると想定します) .)

3) また、ハッシュ化されたパスワードの最初の 3 文字/数字を str_shuffle の影響を受けないようにして、パスワードが正しいことを確認するのにも役立つかもしれません。(2 つのチェックを作成することにより、1) 両方の文字列が同じ FIRST 3 CHARS/Numbers & 2 を共有しているかどうかをチェックし、2) 次に、各文字列の文字数を比較します。(パスワードの衝突が頻繁に発生しないことを願っています)。

4) 明らかに、他のセキュリティ対策が追加されます (つまり、最大ログイン試行数、captcha など。自動化されたブルートフォース攻撃から保護し、ハッカーが可能なパスワードまたは実際のパスワードを見つけるのを困難にします)。

私はこれの PoC を成功させました。パスワード衝突の可能性を確認するために、辞書攻撃/ブルート フォース攻撃に対して PoC をまだテストしていませんが、それは魅力のように機能します。& それらの頻度。

「役に立たない」情報をたくさん述べた場合は、無視してください。私はこれを合理的に説明するために最善を尽くしています。

4

4 に答える 4

2

これは私にはひどく効果がなく、安全ではないようです。

最も注目すべき点: 衝突。あなたはすでにその他の情報でそれを述べました。

ハッシュとスクランブルの文字数をチェックするだけで、衝突の可能性が高くなります。1 つのパスワードを有効にして、そのハッシュのすべての順列に対しても有効にします。ワールプール ハッシュの 128 文字の長さを考慮すると、これは非常に大きな数字です。

したがって、基本的に、これを許可することで、ブルートフォーサーを志望する者が 1 つのパスワードを入力するだけで、一度に何千ものパスワードをチェックできるようになります。

ログインごとにハッシュを変更すると言ったので、システムへの永続的なアクセスは得られませんが、一度アクセスできる可能性は大幅に増加します。

変質塩に関しては…どうやって?ハッシュ前ではなくハッシュ後にソルトを適用しない限り、方法は考えられません。これは、ソルトがハッシュでどのように機能するかではありません。

より安全にしたい場合は、複数のハッシュ反復を使用してください。ハッシュされたパスワードとハッシュの反復回数を保存します。ユーザーがログインするたびに、ハッシュを再度ハッシュして保存し、反復回数を増やします。これにより、暗号化の弱点をあまり導入することなく、保存されたハッシュが十分に変更されます。

于 2014-01-29T09:12:29.830 に答える
0

シャッフル スキームを使用すると、パスワードの安全性が低下します。シャッフル後に文字と数字のインスタンス数を比較すると、2 人が同じパスワード値を持つ可能性が高くなります (衝突、あなたが言ったように)。

再塩漬けはあなたが使うことができるものです。ユーザーが正常にログインするたびに、パスワードを再ソルトして再度保存できます。これは、PHP のパスワード プロシージャを変更して高解像度の時間値を使用し、一意性を高めれば、さらに改善される可能性があります。基本的に、パスワードのソルトを継続的にローテーションしています。クリアパスワードを保存し、そのハッシュを保存したものと比較し、クリアパスワードを再ソルトしてハッシュし、再度保存する必要があります。

于 2014-01-29T09:20:06.637 に答える