コンセプト-ブルヌトフォヌス攻撃に察するパスワヌド「12345」の保護を匷化する方法2回目の詊行

曎新再詊行に倱敗したした。



私はい぀も、ハッカヌがサむトで他の誰かのパスワヌドを解読できないようにしたかったのです。

たずえば、ナヌザヌが自分のパスワヌドが数字だけで構成されおいるこずをハッカヌに自慢した堎合、すぐにナヌザヌは自分のアカりントを倱いたす。



しかし、ナヌザヌが劻に電話でパスワヌドを枡し、ハッカヌがそれを聞いた堎合はどうなるでしょうか。



䜕ハッカヌはパスワヌドを知っおいたすかこれはすべお倧倱敗です。そのようなナヌザヌが自分のアカりントを乗っ取るのを難しくするのを手䌝っおくれたせんかこの質問はい぀も私を心配しおいお、私はそれをする方法を芋぀けたず思いたす。たたは、よくあるこずですが、それを再発芋したした。結局のずころ、すべおは私たちの前に長い間発明されおきたした。



入門



  • ナヌザヌは、サむト「12345」でパスワヌドを取埗したいず考えおいたす。
  • ハッカヌはこのパスワヌドを簡単に掚枬できたす。
  • ただし、ナヌザヌはログむンする必芁があり、ハッカヌはログむンしたせん。ハッカヌがログむンずパスワヌドを知っおいおも。
  • 远加サヌビスの圢で秘密のコヌドず仲介者を含むSMSはありたせん。ログむンペヌゞを持぀ナヌザヌずサむトのみ。
  • たた、トロリヌバスで劻に「ガリア、ログむンアリスのサむトサむトでパスワヌドを123456に倉曎したした。12345よりも人気があるず蚀われおいたす」ず蚀うのも比范的安党です。そしお、あなたのアカりントがすぐにハッキングされるこずを恐れないでください。


この方法はどのように機胜したすかすべおの詳现はカットの䞋にありたす。



必芁なもの



  • 抂念は認蚌方法を説明するだけです
  • 実装では、「ナヌザヌ名」、「パスワヌド」、「salt1」、「salt2」のみを保存する必芁がありたす。はい、2぀の塩。
  • redisのログテヌブルずカりンタヌなしで行う
  • IPアドレスのテヌブルは保持したせん
  • SMSは䜿甚したせん
  • ログむンの詊行はブロックされたせん。私の最埌の倱敗した詊みから知っおいるように、入り口をブロックするこずは無意味です-ハッカヌが制限時間に達したずしおも、圌は単に耇数のナヌザヌからパスワヌドを傷぀け始めたす。さらに、ナヌザヌ自身が制限を受けるこずになりたす。クヌルな写真であなたのサむトにログむンするために圌をサポヌトに電話したせんか
  • ナヌザヌはい぀でもパスワヌドを倉曎しお、他のデバむスでは無効にするこずができたす。これは䞀般的なルヌルですが、蚀及する䟡倀があるず思いたす。
  • 蟞曞を䜿甚しおパスワヌドを掚枬するプロセスをハッカヌにずっおより困難にするこずができたすオプション、以䞋で説明したす。


メ゜ッド゚ッセンス



ナヌザヌがパスワヌド「12345」を持぀こずを蚱可し、そのパスワヌドを解読するこずをより困難にする必芁がありたす。たずえば、ハッシュのように芋えるパスワヌドを掚枬する方法。



どうやっお



ブラりザに、パスワヌドを゜ルトするための䞀意の゜ルトが垞にある堎合を想像しおみおください。各ナヌザヌの塩。なぜそれが必芁なのですか暗号化する。たずえば、文字列「12345」を塩「saltsalt」でargon2idに暗号化するず、「$ argon2id $ v = 19 $ m = 16、t = 2、p = 1 $ c2FsdHNhbHQ $ jX94laSi6vo9AhS + bHwbkg」が埗られたす。゜ルトを倉曎するず、ハッシュが異なりたす。 1぀のアルゎリズムは、それぞれに異なる゜ルトを䜿甚するこずにより、同じパスワヌドを異なる方法で暗号化したす。良い。



しかし、最初にこの塩をどこで手に入れるのですかはい、ここで圌女はモニタヌの前に座っおいたす。圌に2぀か3぀の䜙分なキャラクタヌを絞り出させ、぀いに人間的にログむンさせたす。走り回っおいる猫はいたすかさお、猫を飌いたしょう。猫ずはこれが私たちの秘密の蚀葉です。登録時にサヌバヌに送信し、この単語の゜ルトを生成したす。そしお、圌はこの塩を私たちに送りたす。それだけです-ブラりザには塩がありたす。今床はパスワヌド。たた、パスワヌドを暗号化し、サヌバヌが送信した゜ルトで゜ルトしたす。



今は「12345」のヘルメットをかぶっおいたせん。ハッシュを送信したすが、ナヌザヌごずに独自の゜ルトがあるため、ハッシュは異なりたす。



総圓たり攻撃は今や病気になるようです远加の蚈算を行い、単玔な数字の代わりにアルゎンハッシュの長い文字列を繰り返す必芁があるだけでなく、各ナヌザヌも独自のハッシュを持っおいたす-今では、パスワヌドず同じ文字列を詊しお党員をチェックするのは無意味ですナヌザヌ。3人のナヌザヌが同じパスワヌド12345を遞択したずしたしょう。ただし、ハッシュは異なりたす。誰もが違う塩を持っおいるからです。



  • ブラりザは、サヌバヌが以前に送信した゜ルトを䜿甚しおパスワヌドハッシュを蚈算する必芁がありたす。パスワヌド自䜓ではなく、ハッシュを送信する必芁がありたす。
  • サヌバヌは、ナヌザヌだけが知っおいる秘密の単語を䜿甚しお゜ルトを送信したす。簡単なこずもありたす。䟋-「猫」。
  • 各ナヌザヌは独自の゜ルトを持っおいる必芁がありたす。
  • 同じ秘密の蚀葉を遞んだ2人のナヌザヌは、異なる塩を持っおいる必芁がありたす。
  • サヌバヌは、正しい秘密の単語が䜿甚されたかどうか、およびこのナヌザヌにずっお゜ルトが正しいかどうかを報告する必芁はありたせん。そうでない堎合、1぀ではなく2぀の単玔なパスワヌドがブルヌトフォヌスになりたす。
  • ナヌザヌが秘密の蚀葉を倉曎するず、塩も倉曎されたす。


぀たり、圌の単玔なパスワヌドを保護するために、ナヌザヌは別の非垞に単玔な単語を考え出す必芁がありたす。圌は認蚌されたいずころならどこでもこの単語を入力し、それからパスワヌドだけを入力する必芁がありたす。圌がクッキヌをクリアするたで。



  • サむトに行きたした
  • ログむンず秘密の蚀葉を入力したした
  • 入力したパスワヌド
  • 準備ができたした


パスワヌドず秘密の蚀葉は非垞に単玔です。1぀たたは2぀の文字。たずえば、パスワヌドは12345で秘密の単語は42です。そしお、誰かが秘密の単語42を思い぀いたずしおも、それは恐ろしいこずではありたせん。



䜿い方。ステップバむステップのコンセプト



次の芁玠がありたす。



  • Webサヌバヌ
  • デヌタベヌスずナヌザヌテヌブル



    • ログむンする
    • password_hash
    • salt_unique_for_each_user
    • salt_for_password
  • ナヌザヌのブラりザ
  • ハッカヌブラりザ
  • サむトのログむンおよび登録ペヌゞ
  • ログむンフォヌムの送信むベントをむンタヌセプトするスクリプト


次に、同じ暗号化システムでも、パラメヌタヌを倉えるだけで実装できる2぀の異なるアルゎリズムが必芁です。



  • ALG1は、文字列ず゜ルトからハッシュを生成する非察称暗号化アルゎリズムです。ALG1str、salt= hash1。このアルゎリズムはサヌバヌでのみ䜿甚されたす。
  • ALG2は、文字列ず゜ルトからハッシュを生成する非察称暗号化アルゎリズムです。ALG2str、salt= hash2。このアルゎリズムは公に䜿甚されおおり、クラむアントこの䟋ではjavascriptに実装できるはずです。


さらに、さらに2぀の単玔なアルゎリズムが必芁です。



  • ALG_SALTは、ランダム゜ルトを文字列ずしお蚈算するアルゎリズムです。ALG_SALT=゜ルト。このアルゎリズムはサヌバヌでのみ䜿甚されたす。
  • ALG_PASSは、ランダムな単玔なパスワヌドを生成するアルゎリズムです。ALG_PASS=パス。このアルゎリズムはサヌバヌでのみ䜿甚されたす。


むベントを段階的に



  • ナヌザヌはただログむンしおいないため、登録ペヌゞに移動したす。
  • サヌバヌは、ログむン+単玔な秘密の単語の2぀のフィヌルドを持぀フォヌムを衚瀺したす。
  • ナヌザヌがログむンを遞択-アリス
  • ナヌザヌは秘密の蚀葉を遞択したす-猫
  • ナヌザヌが[送信]ボタンをクリックしたす。


サヌバヌは、ナヌザヌaliceがデヌタベヌスに存圚しないこずを確認したす。



サヌバヌは次の倀を蚈算したす。



$salt_unique_for_each_user = ALG_SALT(); //  "saltsalt"
      
      





$salt_for_password = ALG1("cat", $salt_unique_for_each_user); //  "$argon2id$v=19$m=16,t=2,p=1$c2FsdHNhbHQ$jX94laSi6vo9AhS+bHwbkg"
      
      





$user_simple_password = ALG_PASS(); //  "12345"
      
      





$user_simple_password_hashed = ALG2($user_simple_password , $salt_for_password); //  "$argon2id$v=19$m=16,t=2,p=1$JGFyZ29uMmlkJHY9MTkkbT0xNix0PTIscD0xJGMyRnNkSE5oYkhRJGpYOTRsYVNpNnZvOUFoUytiSHdia2c$b+6ROJVsZ62UXA7hEAg0AQ"
      
      





サヌバヌはusersテヌブルにレコヌドを䜜成し、デヌタを保存したす。



INSERT INTO `users` 
(
login, 
password_hashed, 
salt_unique_for_each_user, 
salt_for_password
) 
VALUES 
(
"alice", 
"$argon2id$v=19$m=16,t=2,p=1$JGFyZ29uMmlkJHY9MTkkbT0xNix0PTIscD0xJGMyRnNkSE5oYkhRJGpYOTRsYVNpNnZvOUFoUytiSHdia2c$b+6ROJVsZ62UXA7hEAg0AQ", 
"saltsalt", 
"$argon2id$v=19$m=16,t=2,p=1$c2FsdHNhbHQ$jX94laSi6vo9AhS+bHwbkg"
).

      
      





サヌバヌは、「ナヌザヌアリスが正垞に䜜成されたした。」ずいうメッセヌゞずずもに登録成功ペヌゞをナヌザヌに衚瀺したす。䞀時パスワヌド12345を䜿甚しおログむンしたす。」



ナヌザヌは喜んで叫びたす。「ハレヌ、私はアリスずいうニックネヌムでサむトに登録したした。圌らは私にパスワヌド12345をくれたした。なんお面癜くおシンプルなパスワヌドでしょう。しかし、ナヌザヌのアパヌトの防音は非垞に悪く、圌のハッカヌの隣人はすべおを聞いおいたした。



  • ハッカヌはりェブサむトのアドレスを自分のブラりザにプッシュしたす。
  • ハッカヌのブラりザは空のCookieを送信したす。
  • サヌバヌは、ハッカヌの芁求をチェックしお、「゜ルト」Cookieがあるかどうかを確認したす。圌女が芋぀かりたせん。
  • ハッカヌが盗んだナヌザヌ名ずパスワヌドを送信する前に、ブラりザはパスワヌドを暗号化するための゜ルトを知る必芁がありたす。
  • ハッカヌのブラりザはただ「salt」Cookieにsaltを保存しおいたせん。
  • サヌバヌは、ログむン+シヌクレットワヌドの2぀のフィヌルドを含むログむンフォヌムを送信しお、ナヌザヌが゜ルトを取埗できるようにしたす。


ハッカヌは混乱しおいたす。ずりあえず圌から離れたしょう。



  • ナヌザヌはログむンペヌゞに戻りたす。
  • ナヌザヌのブラりザは空のCookieを送信したす。
  • サヌバヌはナヌザヌの芁求をチェックしお、「゜ルト」Cookieがあるかどうかを確認したす。圌女が芋぀かりたせん。
  • ナヌザヌがナヌザヌ名ずパスワヌドを送信する前に、ブラりザヌはパスワヌドを暗号化するために゜ルトを知っおいる必芁がありたす。
  • ナヌザヌのブラりザはただ「salt」Cookieにsaltを保存しおいたせん。
  • サヌバヌには2぀のフィヌルドを持぀ログむンフォヌムを送信し、ログむン+秘密の蚀葉塩を取埗するこずを可胜にしたす。
  • ナヌザヌはlogin- alice、secret- catず入力し、[送信]ボタンをクリックしたす。


サヌバヌはリク゚ストを受信し、パスワヌドの代わりに秘密の単語が送信されたこずを確認したす。



  • — alice `salt_unique_for_each_user` -> $db_salt_unique_for_each_user `salt_for_password -> $db_salt_for_password`.
  • , . : $salt_for_password = ALG1(«cat», $db_salt_unique_for_each_user).
  • $salt_for_password . . 12345, , . — ` salt = $db_salt_for_password`. : ` login = «alice»`.


説明サヌバヌは、どの゜ルトが送信されたかを通知したせん-正しいかどうか。正しいナヌザヌ名ずパスワヌドを䜿甚しおログむンしようずするず、その䜿甚結果は明確になりたす。



  • ナヌザヌはサヌバヌ応答を受け取りたす。そのペヌゞはリロヌドされるか、すぐに動的に倉曎されたす。
  • ナヌザヌのブラりザはCookieを送信したすlogin = alice、salt = "$ argon2id $ v = 19 $ m = 16、t = 2、p = 1 $ c2FsdHNhbHQ $ jX94laSi6vo9AhS + bHwbkg"。
  • サヌバヌはナヌザヌの芁求をチェックしお、「゜ルト」Cookieがあるかどうかを確認したす。圌女を芋぀けたす。
  • ブラりザには、パスワヌドを暗号化するための゜ルトがすでにありたす。
  • サヌバヌは、loginすでに倀aliceを持っおいたす+ passwordの2぀のフィヌルドを持぀ログむンフォヌムを送信したす。
  • ナヌザヌは簡単なパスワヌド12345を入力し、[送信]ボタンをクリックしたす。
  • ブラりザはonSubmitむベントをむンタヌセプトしたす。
  • $ password_hashed = ALG2 "12345"、 "$ argon2id $ v = 19 $ m = 16、t = 2、p = 1 $ c2FsdHNhbHQ $ jX94laSi6vo9AhS + bHwbkg"を蚈算したす。
  • デヌタ「alice」を送信したす/ $ argon2id $ v = 19 $ m = 16、t = 2、p = 1 $ JGFyZ29uMmlkJHY9MTkkbT0xNix0PTIscD0xJGMyRnNkSE5oYkhRJGpYOTRsYVNpNnZvHOUFoAUyti $


サヌバヌは認蚌芁求を受信したす。



  • ログむン+パスワヌドデヌタ "alice" / $ password_hashed
  • デヌタベヌスに移動し、倀 ` password_hashed`- > $ db_password_hashedを取埗したす。
  • $ db_password_hashed === $ password_hashedを比范したすか
  • ハッシュが䞀臎し、承認が成功したした。


泚私の䟋では、サヌバヌはハッシュを盎接比范したす。ただし、実際にはすでにパスワヌドである文字列をデヌタベヌスに保存するこずはできたせん。それらは盗たれお、ログむンパスワヌドの圢で䜿甚される可胜性がありたす。したがっお、どんなに奇劙に聞こえおも、ハッシュをハッシュする必芁がありたす。これは、3番目の塩が必芁であるこずを意味したす。ただし、デヌタベヌスではなく、環境倉数に栌玍する必芁がありたす。ただし、これらはすでに実装の詳现であり、簡単にするために省略しおいたす。



その間に、ハッカヌはこの奇劙なログむンフォヌムをテストするこずにしたした。



  • ハッカヌはlogin- alice、secret- dogず入力し、[送信]ボタンをクリックしたす。
  • サヌバヌはハッカヌの芁求を受信し、パスワヌドの代わりに秘密の単語が送信されたこずを確認したす。
  • — alice `salt_unique_for_each_user` -> $db_salt_unique_for_each_user `salt_for_password` -> $salt_for_password.


  • , , : $result_fake_salt = ALG1(«dog», $db_salt_unique_for_each_user). , .


サヌバヌは、蚈算された゜ルト倀をナヌザヌのブラりザヌに送り返したす。ヘッダヌは次のこずを瀺しおいたす-`setcookie salt = $ result_fake_salt`。ログむンも保存されたす `set the cookie login =" alice "`。



説明ハッカヌのハヌドワヌクを支揎するために、サヌバヌはハッカヌに塩を送りたす。しかし、秘密の蚀葉が正しいかどうかを倖郚から刀断するこずは䞍可胜です。



  • ハッカヌはサヌバヌの応答を受信したす。そのペヌゞはリロヌドされるか、すぐに動的に倉曎されたす。
  • ハッカヌのブラりザはCookieを送信したすlogin = alice、salt = $ result_fake_salt。
  • サヌバヌはナヌザヌの芁求をチェックしお、「゜ルト」Cookieがあるかどうかを確認したす。圌女を芋぀けたす。
  • ハッカヌのブラりザには、パスワヌドを暗号化するための゜ルトがすでにありたす。
  • : ( alice) + .
  • 12345 "".
  • onSubmit.
  • $password_hashed = ALG2(«12345», $result_fake_salt).
  • «alice»/$password_hashed.


サヌバヌは認蚌芁求を受信したす-"alice" / $ password_hashed。

デヌタベヌスに移動し、倀 `password_hashed`-> $ db_password_hashedを取埗したす。

比范$ password_hashed === $ db_password_hashedいいえ。



これらの最初は同䞀のパスワヌドのハッシュが䞀臎したせん。圌らはさたざたな方法で塩挬けされたからです。



ハッカヌはあきらめず、サむトに別のナヌザヌを登録したす。



たったくの偶然で、圌は壁の埌ろのナヌザヌず同じ秘密の蚀葉を入力したす-猫。



ハッカヌは、新しいアカりントのパスワヌドの有効な゜ルトを取埗し、ハッシュスクリプトでそれを眮き換えようずしたす。



幞い、パスワヌド゜ルトの生成には2番目の゜ルト `salt_unique_for_each_user`が䜿甚されたした。これは、ナヌザヌごずに新しい方法で生成されたす。そのため、同じパスワヌドず、最も重芁なのは秘密の蚀葉を䜿甚しおいる堎合でも、ナヌザヌが異なれば、塩も異なりたす。そしお、同じ秘密の蚀葉を持぀ナヌザヌの塩は、別の塩ず䞀臎したせん。たた、パスワヌドの䞀臎も問題にはなりたせん。



さお、蟞曞でのブルヌトフォヌスパスワヌドの耇雑さに぀いお。サヌバヌずクラむアントの䞡方に共通するALG2を倉曎し、それを面倒にするず、ハッカヌの怜玢が非垞に耇雑になりたす。 ALG2は、サヌバヌに送信されるパスワヌドハッシュを取埗するプロセスであるこずを思い出しおください。サヌバヌでは、このハッシュはすでに蚈算され、デヌタベヌスに保存されおいたす。



  • サヌバヌは、デヌタベヌスにパスワヌドを曞き蟌んだり、パスワヌドを倉曎したりするずきに、ALG2操䜜を1回だけ実行したす。
  • クラむアントは、認蚌䞭にのみALG2操䜜を実行したす認蚌ず混同しないでください。クラむアントがパスワヌドを入力するずきに数回間違えたずしたしょう-それは問題ありたせん。
  • ハッカヌはパスワヌドごずにこれを垞に行いたすが、これは祝犏するこずができたす。123/1234/12345のようなパスワヌドに倚倧な劎力が費やされるこずは特に皮肉なこずです。


匱いマシンは、速いマシンよりも操䜜の完了にはるかに長い時間がかかる可胜性がありたす。これは問題になる可胜性がありたす。したがっお、アルゎリズムを耇雑にする必芁はありたせん。



コンセプトの説明を1バレルのタヌルで仕䞊げたす。



  • ナヌザヌが誀っお秘密の単語を誀っお入力した堎合、ナヌザヌは自分のパスワヌドを䜿甚しお入力できない状況になりたす。シヌクレットワヌドをリセットしこの堎合はCookieを削陀し、リク゚ストを再送信する必芁がありたす。これは、ボタンを1぀抌すだけで透過的に実装できたすが、その前にナヌザヌが掚枬する必芁がありたす。5回の誀ったログむン詊行で匷制的にリセットできたす。
  • 同じコンピュヌタヌ䞊の2人のナヌザヌは、垞にお互いの塩を捚おる必芁がありたす。
  • 2぀の異なるコンピュヌタヌが同じパスワヌド゜ルトを受け取りたす
  • サヌバヌ䞊で䞀方のコンピュヌタヌを介しお゜ルトが倉曎された堎合、叀い゜ルトを䜿甚しおいるもう䞀方のコンピュヌタヌは、゜ルトを倉曎する必芁があるこずを認識したせん。
  • パスワヌドが非垞に単玔であるこずを知っおいれば、コンピュヌタヌから塩を盗み、それを䜿甚しおアカりントに察しお非垞に高速な攻撃を実行できたす。


...そしおスプヌン䞀杯の蜂蜜



  • . , "cat" , "termorectal" — . , . , . , .
  • . `salt_for_password` , , , . .



All Articles