Zxcvbn: рдпрдерд╛рд░реНрдерд╡рд╛рджреА рдкрд╛рд╕рд╡рд░реНрдб рд╢рдХреНрддрд┐ рдореВрд▓реНрдпрд╛рдВрдХрди

рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рдорд╣реАрдиреЛрдВ рдореЗрдВ, рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рд▓рдЧрднрдЧ рд╣рд░ рд░реВрдк рдореЗрдВ рдкрд╛рд╕рд╡рд░реНрдб рд╕реНрдЯреНрд░реЗрдВрде рдПрдирд╛рд▓рд╛рдЗрдЬрд░ рдореЗрд░реЗ рд╕рд╛рдордиреЗ рдЖрдП рд╣реИрдВред рдЖрдЬ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рддреЗрдЬреА рд╕реЗ рд╡рд┐рдХрд╛рд╕ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдПрдХрдорд╛рддреНрд░ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЦрд╛рддреЗ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ? рдЗрдВрдЯрд░рдиреЗрдЯ рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛ рдпрд╣ рдкрд╣рд▓реВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреБрдЫ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:


рдпрджрд┐ рдЖрдк рдЙрдкрд░реЛрдХреНрдд рдХрд╛рд░рдХреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рд╛рдБ, рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдкрд╛рд╕рд╡рд░реНрдб рд╕реБрд░рдХреНрд╖рд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЖрд╢рд╛рдЬрдирдХ рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред 2006 рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдЙрдирдХреА рдкреБрд╕реНрддрдХ рдореЗрдВ, "рдкрд░рдлреЗрдХреНрдЯ рдкрд╛рд╕рд╡рд░реНрдб: рд╕рд┐рд▓реЗрдХреНрд╢рди, рдкреНрд░реЛрдЯреЗрдХреНрд╢рди, рдСрдереЗрдВрдЯрд┐рдХреЗрд╢рди" рд╢реАрд░реНрд╖рдХ рд╕реЗ рдорд╛рд░реНрдХ рдмрд░реНрдиреЗрдЯ рдиреЗ рд╡рд┐рднрд┐рдиреНрди рд▓реАрдХреНрд╕ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЙрдЬрд╛рдЧрд░ рдХрд┐рдП рдЧрдП рдХрдИ рдорд┐рд▓рд┐рдпрди рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЖрд╡реГрддреНрддрд┐ рдХреА рдЧрдгрдирд╛ рдХреА рдбреЗрдЯрд╛ред рд╡рд╣ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рд░ рдиреМрд╡реЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рд╕реЗ рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рдЪреБрдирд╛ред рдЙрдирдореЗрдВ рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ "рдХрдард┐рди рдкрд╛рдЧрд▓" рд╣реИрдВ: рдкрд╛рд╕рд╡рд░реНрдб 1, рдХреЙрдореНрдкреИрдХ, 7777777, рдорд░реНрд▓рд┐рди рдФрд░ рдЧреБрд▓рд╛рдмред рдкрд┐рдЫрд▓реЗ рд╕рд╛рд▓, рдмрд░реНрдиреЗрдЯ рдиреЗ рдПрдХ рдирдпрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ , рдЬрд┐рд╕рдореЗрдВ 6 рдорд┐рд▓рд┐рдпрди рдкрд╛рд╕рд╡рд░реНрдб рдХреА рдЬрд╛рдВрдЪ рдХреА рдЧрдИ, рдФрд░ рдЗрд╕ рдмрд╛рд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ 99.8% 10,000 рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдХреА рд╕реВрдЪреА рдореЗрдВ рд╣реИрдВ, рдФрд░ 91% 1000 рд╕рдмрд╕реЗ рдЖрдо рдХреА рд╕реВрдЪреА рдореЗрдВ рд╣реИрдВред рдмреЗрд╢рдХ, рдкрд░рд┐рдгрд╛рдо рдХрд╛рдлреА рд╣рдж рддрдХ рдЕрдиреБрд╕рдВрдзрд╛рди рдкрджреНрдзрддрд┐ рдФрд░ рдирдореВрдирд╛ рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдерд╛ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪреВрдВрдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрд╛рд╕рд╡рд░реНрдб рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреНрд░реИрдХ рдХрд┐рдП рдЧрдП рд╣реИрд╢ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рдереЗ, рдЗрд╕рд▓рд┐рдП рдкреВрд░реА рд╕реВрдЪреА рд╢реБрд░реВ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдХреНрд░реИрдХ рдХрд┐рдП рдЧрдП рдкрд╛рд╕рд╡рд░реНрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдкрдХреНрд╖рдкрд╛рддреА рдереАред

рдХреЗрд╡рд▓ рдЖрд╕рд╛рди-рд╕реЗ-рдЕрдиреБрдорд╛рдирд┐рдд рдкрд╛рд╕рд╡рд░реНрдб рдпрд╣рд╛рдВ рд╕реВрдЪреАрдмрджреНрдз рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдмрд╛рдХреА рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдкреНрд░рддрд┐рд╢рдд рдЕрднреА рднреА рдХрд╛рдлреА рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИ рдФрд░ рдПрдХ рдЫреЛрдЯреЗ рдиреЗрдЯрд╡рд░реНрдХ рд╣рдорд▓реЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рджрд░рд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рд╕рдВрдкрд░реНрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдРрд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдкрд╛рд╕рд╡рд░реНрдб рдЪреБрдирдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдлрд┐рд▓рд╣рд╛рд▓, рд╡реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рдиреБрдХрд╕рд╛рди (рдХрдИ рдмрдВрдж-рд╕реНрд░реЛрдд рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреА рдЧрд┐рдирддреА рдирд╣реАрдВ)ред рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред
рдмрд┐рдЯреНрд╕ рдореЗрдВ рд╡реНрдпрдХреНрдд рдПрдВрдЯреНрд░реЙрдкреА рдХреЗ рдореВрд▓реНрдп рд╕реЗ рдкрд╛рд╕рд╡рд░реНрдб рдХреА рддрд╛рдХрдд рдХреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдорд╛рдкрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдВрдЯреНрд░реЛрдкреА рдХреА рдЧрдгрдирд╛ рд╕рдВрднрд╡ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд╕реЗрдЯ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИред рдпрд╣рд╛рдБ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдкрд╛рд╕рд╡рд░реНрдб рд╢рдХреНрддрд┐ рдЖрдХрд▓рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╣реИ:

# n:   # c:  :    # (26  ,     , 62 тАФ  ,      ,   )  = n * lg(c) #    2 


рдпрд╣ рдкреНрд░рддреНрдпрдХреНрд╖ рдЪрдпрди рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЕрдХреНрд╖рд░реЛрдВ, рд╕рдВрдЦреНрдпрд╛рдУрдВ рдФрд░ рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЕрдиреБрдХреНрд░рдореЛрдВ рд╕реЗ рдпреБрдХреНрдд рдкрд╛рд╕рд╡рд░реНрдб рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдФрд░ рдХреЗрд╡рд▓ рдХреБрдЫ рдЕрдкрд╡рд╛рджреЛрдВ (рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП 1Password / KeePass рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдзрдиреНрдпрд╡рд╛рдж) рдХреЗ рд╕рд╛рде, рд▓реЛрдЧ рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЛ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирддреЗ рд╣реИрдВ - рд╢рдмреНрджрдХреЛрд╢ рд╢рдмреНрдж, рд╕рд░рд▓ рдХреАрдмреЛрд░реНрдб рдЕрдиреБрдХреНрд░рдо, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП qwerty, asdf рдФрд░ zxcvbn, рджреЛрд╣рд░рд╛рддрд╛ (aaaaaaa), рдЕрдиреБрдХреНрд░рдо (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) , abcdef рдпрд╛ 654321), рд╕рд╛рде рд╣реА рдЙрдкрд░реЛрдХреНрдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рдВрдпреЛрдЬрдиред рдпрджрд┐ рдкрд╛рд╕рд╡рд░реНрдб рдореЗрдВ рдЕрдкрд░рдХреЗрд╕ рдЕрдХреНрд╖рд░ рд╣реИрдВ, рддреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрддреНрд░ рдореЗрдВ рдкрд╛рд╕рд╡рд░реНрдб рдХрд╛ рдкрд╣рд▓рд╛ рдЕрдХреНрд╖рд░ рд╣реЛрдЧрд╛ред рд╕рдВрдЦреНрдпрд╛рдУрдВ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА рдЕрдХреНрд╕рд░ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реЛрддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рд╢рдмреНрджрдЬрд╛рд▓ l33t рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг (рд╕рдВрдЦреНрдпрд╛ 3 рдЕрдХреНрд╖рд░ рдИ, 0 - рдУ, @ рдпрд╛ 4 - рдП), рд╡рд░реНрд╖реЛрдВ, рддрд┐рдерд┐рдпреЛрдВ, рдкреЛрд╕реНрдЯрд▓ рдХреЛрдбреНрд╕ рдЖрджрд┐ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИред

рдирддреАрдЬрддрди, рдкрд╛рд╕рд╡рд░реНрдб рдХреА рддрд╛рдХрдд рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рддрд░реАрдХреЗ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдирд╣реАрдВ рд╣реИрдВред рдЖрдорддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рдмрд┐рдирд╛, рдкрд╛рд╕рд╡рд░реНрдб рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдФрд░ рдкреНрд░рддреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рд╣реИрдХрд┐рдВрдЧ рдХреЛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдХрд░реЗрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдпрд╛рджрджрд╛рд╢реНрдд рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░реЗрдЧреАред Xkcd рдкрд░ рдХреЙрдорд┐рдХреНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ:
рдХреЙрдорд┐рдХ рдмреБрдХ >

рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдбреНрд░реЙрдкрдмреЙрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд рдПрдХ рдЕрдЧрд▓реЗ рд╕реНрд░реЛрдд "рдХреНрд░реИрдХрд░ рд╡реАрдХ" рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдПрдХ рдУрдкрди рд╕реЛрд░реНрд╕ рдкрд╛рд╕рд╡рд░реНрдб рд╕реНрдЯреНрд░реЗрдВрде рдПрдирд╛рд▓рд╛рдЗрдЬрд╝рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╕рд╛рдзрд╛рд░рдг рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░реЗрдЧрд╛ рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдХреЙрдореНрдкреНрд░реЛрдорд╛рдмреНрд░реЗрдЯреЗрд░рд┐рд╕реНрдЯреЗрдкрд▓ (рд░рд┐рдЯрд░реНрди рд╣реЙрд░реНрд╕) рдЬреИрд╕реЗ рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рдкрд╛рд╕рдлрд╝реНрд░реЗрдЬрд╝ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдЕрдм dropbox.com/register рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ рдФрд░ github рдкрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ ред рдЖрдк рд╕реНрд╡рдпрдВ рдбреЗрдореЛ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрдИ рдкрд╛рд╕рд╡рд░реНрдб рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдиреАрдЪреЗ рджреА рдЧрдИ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ, zxcvbn рдХреА рддреБрд▓рдирд╛ рдЕрдиреНрдп рдкрд╛рд╕рд╡рд░реНрдб рд╢рдХреНрддрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЗ рд╕рд╛рде рдХреА рдЧрдИ рд╣реИред рддреБрд▓рдирд╛ рдХрд╛ рдмрд┐рдВрджреБ рдЕрдиреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рд╡рд┐рдлрд▓рддрд╛ рдХреЛ рд╕рд╛рдмрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ - рдкреНрд░рддреНрдпреЗрдХ рд╕рд╛рдЗрдЯ рдХреА рдЕрдкрдиреА рдкрд╛рд╕рд╡рд░реНрдб рдиреАрддрд┐ рд╣реИ - рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ zxcvbn рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдмреЗрд╣рддрд░ рд╡рд┐рдЪрд╛рд░ рджреЗрдирд╛ рд╣реИред

qwER43@!Tr0ub4dour&3correcthorsebatterystaple
рд╕рдХрддреЗ рд╣реИрдВ zxcvbn
рдбреНрд░реЙрдкрдмреЙрдХреНрд╕ (рдкреБрд░рд╛рдирд╛)
рд╕рд┐рдЯреА рдмреИрдВрдХ
рдмреИрдВрдХ рдСрдл рдЕрдореЗрд░рд┐рдХрд╛рди рд╕рд╣рдиреЗ рдпреЛрдЧреНрдпрди рд╕рд╣рдиреЗ рдпреЛрдЧреНрдпрди рд╕рд╣рдиреЗ рдпреЛрдЧреНрдп
рдЪрд╣рдЪрд╣рд╛рдирд╛
рдкреЗрдкреИрд▓
рдИрдмреЗрди рд╕рд╣рдиреЗ рдпреЛрдЧреНрдп
рдлреЗрд╕рдмреБрдХ
рдпрд╛рд╣реВ!
рдЬреАрдореЗрд▓

рдХреБрдЫ рдиреЛрдЯ:



рд╕реНрдерд╛рдкрдирд╛


Zxcvbn рд╕рд┐рд╕реНрдЯрдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ (рд╕рдВрд╕реНрдХрд░рдг 7 рд╕реЗ рд╢реБрд░реВ) / рдУрдкреЗрд░рд╛ / рдлрд╛рдпрд░рдлреЙрдХреНрд╕ / рд╕рдлрд╛рд░реА / Google рдХреНрд░реЛрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдЕрдкрдиреЗ рдкрдВрдЬреАрдХрд░рдг рдкреГрд╖реНрда рдкрд░ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

 <script src="zxcvbn-async.js" type="text/javascript"> </script> 


Zxcvbn-async.js рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЖрдХрд╛рд░ рд╕рд┐рд░реНрдл 350 рдмрд╛рдЗрдЯреНрд╕ рд╣реИред Window.load рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЬрдм рдкреГрд╖реНрда рд▓реЛрдб рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ zxcvbn.js рд▓реЛрдб рд╣реЛрдирд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛ - 680 Kbytes (рдпрд╛ gzip рдореЗрдВ 320 Kbytes) рдХреА рдПрдХ "рднрд╛рд░реА" рдлрд╝рд╛рдЗрд▓, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рд╣реИред рдореИрдВрдиреЗ рдХрднреА рднреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЖрдХрд╛рд░ рдХрд┐рд╕реА рднреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдмрдирд╛рддреЗ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ: рдЪреВрдВрдХрд┐ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдорддреМрд░ рдкрд░ рдкрд╛рд╕рд╡рд░реНрдб рдЪреБрдирдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкрдВрдЬреАрдХрд░рдг рдлреЙрд░реНрдо рдореЗрдВ рдЕрдиреНрдп рдбреЗрдЯрд╛ рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рдордп рд╣реИред рдпрд╣рд╛рдБ рд╡рд┐рднрд┐рдиреНрди рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЛрдбрд┐рдВрдЧ рдХрд╛ рдкреВрд░рд╛ рд╡рд┐рд╡рд░рдг рд╣реИред
Zxcvbn рд╡реИрд╢реНрд╡рд┐рдХ рдирд╛рдорд╕реНрдерд╛рди рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рддрд╛ рд╣реИ:

 zxcvbn(password, user_inputs) 


рдпрд╣ рдПрдХ рдЖрд╡рд╢реНрдпрдХ рддрд░реНрдХ (рдкрд╛рд╕рд╡рд░реНрдб) рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░рд┐рдгрд╛рдо рд╡рд╕реНрддреБ рд▓реМрдЯрд╛рддрд╛ рд╣реИ:

 result.entropy #  result.crack_time #     (.) result.crack_time_display #    ,    : # ┬л┬╗, ┬л6 ┬╗, ┬л┬╗  . . result.score #  ,  0, 1, 2, 3  4, #     10**2, 10**4, 10**6, # 10**8  , . # (        ) result.match_sequence #   ,   #   result.calculation_time #    ();     


рд╡реИрдХрд▓реНрдкрд┐рдХ user_inputs рддрд░реНрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдПрдХ рд╕рд░рдгреА рд╣реИ рдЬреЛ zxcvbn рдЗрд╕рдХреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рдЗрд╕рдореЗрдВ рдХреЛрдИ рднреА рд░реЗрдЦрд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдлреЙрд░реНрдо рдХреЗ рдЕрдиреНрдп рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ рд╣реЛрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд╛рдо рдпрд╛ рдИрдореЗрд▓ рдкрддрд╛)ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рд╡рд╛рд▓реЗ рдкрд╛рд╕рд╡рд░реНрдб рдХреА рддрд╛рдХрдд рдмрд╣реБрдд рдХрдо рдЖрдВрдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдпрд╣ рд╕реВрдЪреА рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╕рд╛рдЗрдЯ рдХреЗ рд╡рд┐рд╢реЗрд╖ рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рд▓рд┐рдП рд▓реЗрдЦрд╛рдВрдХрди рдХреЗ рд▓рд┐рдП рднреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдбреНрд░реЙрдкрдмреЙрдХреНрд╕ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ)ред

Zxcvbn рдХрд╛рд░реНрдпрдХреНрд░рдо CoffeeScript рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред Zxcvbn.js рдФрд░ zxcvbn-async.js рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдХреНрд▓реЛрдЬрд░ рдХрдирд╡рд░реНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ , рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк zxcvbn рдХреЛ рд╕реБрдзрд╛рд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВ, README рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд┐рдХрд╛рд╕ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реИред
рдкрд╛рда рдХреЗ рд╕рд╛рде, рдореИрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ zxcvbn рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реВрдВред

рдЖрджрд░реНрд╢


Zxcvbn рддреАрди рдЪрд░рдгреЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИ: рдорд┐рд▓рд╛рди (рдореЗрд▓-рдорд┐рд▓рд╛рдк), рд╕реНрдХреЛрд░ (рдЧрдгрдирд╛), рдЦреЛрдЬ (рдЦреЛрдЬ)ред


 entropy = lg(26*5) #  7  


рдЦреЛрдЬ рдлрд╝рдВрдХреНрд╢рди рдореЙрдбрд▓ рдХреА рдЖрдзрд╛рд░рд╢рд┐рд▓рд╛ рд╣реИред рдореИрдВ рдЙрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░реВрдВрдЧрд╛ рдФрд░ рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓реМрдЯреВрдВрдЧрд╛ред

рдПрдиреНрдЯреНрд░рд╛рдкреА рдиреНрдпреВрдирддрдо рдЦреЛрдЬ


Zxcvbn рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рдХреА рдПрдиреНрдЯреНрд░рд╛рдкреА рдХреА рдбрд┐рдЧреНрд░реА рдХреА рдЧрдгрдирд╛ рдЙрд╕рдХреЗ рдШрдЯрдХ рднрд╛рдЧреЛрдВ рдХреА рдПрдВрдЯреНрд░реЛрдкрд┐рдпреЛрдВ рдХреЗ рдпреЛрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рддрд╛ рд╣реИред рдкрд╣рдЪрд╛рдиреЗ рдЧрдП рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЗ рдмреАрдЪ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рдХрд┐рд╕реА рднреА рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдмреНрд░реВрдЯ рдлреЛрд░реНрд╕ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рд╡рд╛рд▓реЗ рджреГрд╢реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЙрдирдХреЗ рдЕрдкрдиреЗ рдПрдВрдЯреНрд░реЙрдкреА рднреА рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдПрдиреНрдЯреНрд░рд╛рдкреА рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЙрдкрдирд╛рдо рдХрд╛ рдПрдиреНрдЯреНрд░рд╛рдкреА, рдПрдиреНрдпреВрдорд░реЗрд╢рди рдХрд╛ рдПрдиреНрдЯреНрд░рд╛рдкреА рдФрд░ рдПрдХ рдХреАрдмреЛрд░реНрдб рдХрд╛ рдПрдиреНрдЯреНрд░рд╛рдкреА рд╢рд╛рдорд┐рд▓ рд╣реИ:

 entropy("stockwell4$eR123698745") == surname_entropy("stockwell") + bruteforce_entropy("4$eR") + keypad_entropy("123698745") 


рдпрд╣рд╛рдВ рд╣рдо рдЧрдВрднреАрд░ рдзрд╛рд░рдгрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рдХрд┐ рдкрд╛рд╕рд╡рд░реНрдб рдХреА рдПрдиреНрдЯреНрд░рд╛рдкреА рдЙрд╕рдХреЗ рднрд╛рдЧреЛрдВ рдХреА рдПрдиреНрдЯреНрд░рд╛рдкреА рдХрд╛ рдпреЛрдЧ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдзрд╛рд░рдгрд╛ рдмрд╣реБрдд рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╣реИред "рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдПрдиреНрдЯреНрд░реЙрдкреА" рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗ рдмрд┐рдирд╛ - рдХреНрдпрд╛ рд╣реИ, рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рд╡реНрдпрд╡рд╕реНрдерд╛ - zxcvbn рдЬрд╛рдирдмреВрдЭрдХрд░ рдкрд╛рд╕рд╡рд░реНрдб рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдХрд┐рд╕реА рднреА рдореВрд▓реНрдп рдХреЛ рдЬрд┐рдореНрдореЗрджрд╛рд░ рдард╣рд░рд╛рдП рдмрд┐рдирд╛ рдХреБрд▓ рдПрдиреНрдЯреНрд░рд╛рдкреА рдХреЛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░рддрд╛ рд╣реИ: рдкреНрд░реЛрдЧреНрд░рд╛рдо рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдкрдЯрд╛рдЦрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд╛рд╕рд╡рд░реНрдб рд╕рдВрд░рдЪрдирд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрдирд╛рдо-рдЪрдпрдирд┐рдд рд╕рдВрдпреЛрдЬрди) рдЬрд╛рдирддрд╛ рд╣реИ рдЕрдВрдХ "), рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдЖрдЗрдЯрдо рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреА рдХреЗрд╡рд▓ рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рдЬрдЯрд┐рд▓ рд╕рдВрд░рдЪрдирд╛ рд╡рд╛рд▓реЗ рдкрд╛рд╕рд╡рд░реНрдбреЛрдВ рдХреА рдПрдиреНрдЯреНрд░реЛрдкреА рдХреЛ рдмрд╣реБрдд рдХрдо рдЖрдВрдХрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд╣реАрд╣реЛрд░рд╛рд╕реЗрд░реНрдмреЗрдЯрд┐рд╕реНрдЯрд╛рдкрд▓ (рд╢рдмреНрдж-рд╢рдмреНрдж-рд╢рдмреНрдж-рд╢рдмреНрдж-рд╢рдмреНрдж) рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ рдХреНрд░реИрдХ рдХрд░рдХреЗ, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, L0phtCrack рдпрд╛ John Ripper рдЬреИрд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдкрдЯрд╛рдЦрд╛, рдкрд╣рд▓реЗ рдХрдИ рд╕рд░рд▓ рд╕рдВрд░рдЪрдирд╛рдУрдВ (рд╢рдмреНрдж, рд╢рдмреНрдж-рд╕рдВрдЦреНрдпрд╛, рд╢рдмреНрдж-рд╢рдмреНрдж) рддрдХ рдкрд╣реБрдВрдЪ рдЬрд╛рдПрдЧрд╛ рд╢рдмреНрдж-рд╢рдмреНрдж-рд╢рдмреНрдж-рд╢рдмреНрджред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдХрдореА рдХреЗ рддреАрди рдХрд╛рд░рдг рдореБрдЭреЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ:

рдЗрд╕ рдзрд╛рд░рдгрд╛ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдХреЙрдлреАрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрдХ рдХреБрд╢рд▓ рдЧрддрд┐рд╢реАрд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд░ рдирдЬрд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдореИрдЪреЛрдВ рдХреЗ рдиреНрдпреВрдирддрдо рдбрд┐рд╕рдСрд░реНрдбрд░ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╕рдордп O (n тАв m) рд╣реИ, рдЬреЛ рдХрд┐ рд▓рдВрдмрд╛рдИ n рдХреЗ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕рд╛рдВрдХреЗрддрд┐рдХ рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдореЗрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ (рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ)ред

 # :    ,    #       (match.i)    # (match.j)   ,  minimum_entropy_match_sequence = (password, matches) -> # , 26 тАУ  ,       bruteforce_cardinality = calc_bruteforce_cardinality password up_to_k = [] #    k,  backpointers = [] #      k,  #    (match.j = k). #  ,      for k in [0...password.length] #      : #         #   k-1. up_to_k[k] = (up_to_k[k-1] or 0) + lg bruteforce_cardinality backpointers[k] = null for match in matches when match.j = k [i, j] = [match.i, match.j] # ,     i-1 +   #      j candidate_entropy = (up_to_k[i-1] or 0) + calc_entropy(match) if candidate_entropy < up_to_k[j] up_to_k[j] = candidate_entropy backpointers[j] = match #    ,    match_sequence = [] k = password.length тАУ 1 while k >= 0 match = backpointers[k] if match match_sequence.push match k = match.i тАУ 1 else k -= 1 match_sequence.reverse() #  ┬л┬╗    , #   #       : # 1.j = 2.i тАУ 1    1, # 2. make_bruteforce_match = (i, j) -> pattern: 'bruteforce' i: i j: j token: password[i..j] entropy: lg Math.pow(bruteforce_cardinality, j тАУ i + 1) cardinality: bruteforce_cardinality k = 0 match_sequence_copy = [] for match in match_sequence #     [i, j] = [match.i, match.j] if i тАУ k > 0 match_sequence_copy.push make_bruteforce_match(k, i тАУ 1) k = j + 1 match_sequence_copy.push match if k < password.length #  ┬л┬╗   match_sequence_copy.push make_bruteforce_match(k, password.length тАУ 1) match_sequence = match_sequence_copy #    тАФ    ┬л ┬╗ min_entropy = up_to_k[password.length - 1] or 0 crack_time = entropy_to_crack_time min_entropy #    password: password entropy: round_to_x_digits min_entropy, 3 match_sequence: match_sequence crack_time: round_to_x_digits crack_time, 3 crack_time_display: display_time crack_time score: crack_time_to_score crack_time 


рдмреИрдХрдкреЙрдЗрдВрдЯрд░реНрд╕ [j] рд╕рд░рдгреА рдкрд╛рд╕рд╡рд░реНрдб рдХреНрд░рдо j, рдпрд╛ рдирд▓ рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдПрдХ рдореИрдЪ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдРрд╕рд╛ рдХреЛрдИ рдореЗрд▓ рдирд╣реАрдВ рд╣реИред рдЧрддрд┐рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд╕рд╛рде, рдЗрд╖реНрдЯрддрдо рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЖрдорддреМрд░ рдкрд░ рдЕрдВрдд рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкреНрд░рджрд░реНрд╢рди рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд╛рд╕рд╡рд░реНрдб рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рджреМрд░рд╛рди рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╕рд░рд▓ рдУ (2 рдореАрдЯрд░ ) рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рд╕рднреА рд╕рдВрднрд╡ рдЕрд╕рдВрддреБрд╖реНрдЯ рдЙрдкрд╕рдореБрдЪреНрдЪрдп рдХреЗ рд▓рд┐рдП рд░рдХрдо рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реБрд░реБрдЖрдд рдХреА, рдФрд░ рд╕рдорд╕реНрдпрд╛ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрд╣реБрдд рдЬрд▓реНрджреА рдзреАрдорд╛ рд╣реЛ рдЧрдИред рдЕрдм, рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрд╛рд╕рд╡рд░реНрдбреЛрдВ рдХреЗ рдкреВрд░реНрдг рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП, zxcvbn рдХреБрдЫ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд▓реЗрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдореЛрдЯреЗ рдЕрдиреБрдорд╛рди рдХреЗ рдЕрдиреБрд╕рд╛рд░, Google рдХреНрд░реЛрдо рдореЗрдВ 2.4 GHz рдЗрдВрдЯреЗрд▓ Xeon рдореЗрдВ, рд╕рд╣реАрд╣реЛрд░рд╛рд╕реНрдмреЗрдЯреЗрд░рд┐рд╕реНрдЯреЗрдкрд▓ рдкрд╛рд╕рд╡рд░реНрдб рдХрд╛ рдФрд╕рддрди рд▓рдЧрднрдЧ 3 рдПрдордПрд╕ рдореЗрдВ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкрд╛рд╕рд╡рд░реНрдб coRrecth0rseba ++ ery9 / 23 / 2007staple $ рдФрд╕рдд рдкрд░ рд▓рдЧрднрдЧ 12 рдПрдордПрд╕ рд▓реЗрддрд╛ рд╣реИред

рдЦрддрд░рд╛ рдореЙрдбрд▓: рдПрдиреНрдЯреНрд░рд╛рдкреА рдФрд░ рдмреНрд░реЗрдХрд┐рдВрдЧ рдЯрд╛рдЗрдо рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз


рдПрдиреНрдЯреНрд░реЙрдкреА рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдмрд╣реБрдд рдкрд╛рд░рджрд░реНрд╢реА рд╕рдВрдХреЗрддрдХ рдирд╣реАрдВ рд╣реИред 28-рдмрд┐рдЯ рдкрд╛рд╕рд╡рд░реНрдб рдХрд╛рдлреА рдордЬрдмреВрдд рд╣реИ рддреЛ рдХреИрд╕реЗ рд╕рдордЭреЗрдВ? рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣реИрдХрд┐рдВрдЧ рдХреЗ рд╕рдордп рдореЗрдВ рд╕реАрдзреЗ рдПрдиреНрдЯреНрд░рд╛рдкреА рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рд╕реЗ рдХреИрд╕реЗ рдЬрд╛рдирд╛ рд╣реИ? рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдзрдордХреА рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдорд╛рди рд▓реЗрдВ рдХрд┐:

рдХреБрдЫ рд╕рд╛рдВрдХреЗрддрд┐рдХ рдЖрдВрдХрдбрд╝реЗ:

 #   -,  bcrypt/scrypt/PBKDF2,        #   10 . #      тАФ     ,     #      #   ; #     -   ,    #   тАФ ,   ! SINGLE_GUESS = .010 #  NUM_ATTACKERS = 100 #     SECONDS_PER_GUESS = SINGLE_GUESS / NUM_ATTACKERS entropy_to_crack_time = (entropy) -> .5 * Math.pow(2, entropy) * SECONDS_PER_GUESS 


рдпрд╣рд╛рдВ рдореИрдВрдиреЗ 0.5 рдХреЗ рдЧреБрдгрд╛рдВрдХ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдФрд╕рдд рд╣реИрдХрд┐рдВрдЧ рд╕рдордп рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рди рдХрд┐ рдкреВрд░реЗ рдЦреЛрдЬ рд╕реНрдерд╛рди рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдиреЗ рдХрд╛ рд╕рдордпред
рд╢рд╛рдпрдж рдпреЗ рдЧрдгрдирд╛ рдмрд╣реБрдд рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╣реИрдВред рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╣реИрд╢ рдЪреЛрд░реА рдмрд╣реБрдд рдХрдо рд╣реА рд╣реЛрддреА рд╣реИ, рдФрд░ рдЬрдм рддрдХ рдХрд┐ рд╣рдорд▓рд╛ рд╕реАрдзреЗ рдЖрдк рдкрд░ рди рд╣реЛ, рдкрдЯрд╛рдЦрд╛ рдЖрдкрдХреЗ рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рдкрд░ 100 рдХреЛрд░ рд▓реЗрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред рдЖрдорддреМрд░ рдкрд░, рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдХреЛ рдСрдирд▓рд╛рдЗрди рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рд╣реЛрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╡реЗ рдиреЗрдЯрд╡рд░реНрдХ рд╡рд┐рд▓рдВрдмрддрд╛, рдмрдврд╝рддреА рд╣реБрдИ рд╡рд┐рд▓рдВрдмрддрд╛ рдФрд░ рдХреИрдкреНрдЪрд╛ рд╕реЗ рдкрд░реЗрд╢рд╛рди рд╣реЛрддреЗ рд╣реИрдВред

рдПрдиреНрдЯреНрд░рд╛рдкреА рдЧрдгрдирд╛


рдЕрдм рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдХреИрд╕реЗ zxcvbn рдкрд╛рд╕рд╡рд░реНрдб рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдг рд╕рдВрдпреЛрдЬрди рдХреА рдПрдиреНрдЯреНрд░рд╛рдкреА рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ calc_entropy () рд╣реИред рдпрд╣ рдПрдХ рд╕рд░рд▓ рд╡рд┐рдХрд▓реНрдк рд╣реИ:

 calc_entropy = (match) -> return match.entropy if match.entropy? entropy_func = switch match.pattern when 'repeat' then repeat_entropy when 'sequence' then sequence_entropy when 'digits' then digits_entropy when 'year' then year_entropy when 'date' then date_entropy when 'spatial' then spatial_entropy when 'dictionary' then dictionary_entropy match.entropy = entropy_func match 


рдКрдкрд░, рдореИрдВрдиреЗ рдмрддрд╛рдпрд╛ рдХрд┐ рдХреИрд╕реЗ repeat_entropy рдлрд╝рдВрдХреНрд╢рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдПрдиреНрдЯреНрд░рд╛рдкреА рдЧрдгрдирд╛ рдХреЛрдб рдХрд╛ рдкреВрд░рд╛ рдкрд╛рда рдЬреАрдердм рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рджреЛ рдЕрдиреНрдп рдЧрдгрдирд╛ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛: рд╕реНрдкреИрдЯрд┐рдпрд▓_рдПрдВрдЯреНрд░реЛрдкреА (рдХреАрдмреЛрд░реНрдб рд╕рдВрдпреЛрдЬрди рдХреА рдПрдиреНрдЯреНрд░рд╛рдкреА) рдФрд░ рдбрд┐рдХреНрд╢рдирд░реА_рдПрдВрдЯреНрд░реЛрдкреА (рд╢рдмреНрджрдХреЛрд╢ рдПрдиреНрдЯреНрд░реЙрдкреА)ред
Qwertyhnm рдХреАрдмреЛрд░реНрдб рд╢реЙрд░реНрдЯрдХрдЯ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдпрд╣ q рд╡рд░реНрдг рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рдХреА рд▓рдВрдмрд╛рдИ 9 рд╡рд░реНрдг рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдЖрдВрджреЛрд▓рди рдХреА рддреАрди рджрд┐рд╢рд╛рдПрдБ рд╣реИрдВ: рдкрд╣рд▓реЗ рджрд╛рдИрдВ рдУрд░, рдлрд┐рд░ рдиреАрдЪреЗ рдФрд░ рджрд╛рдИрдВ рдУрд░, рдлрд┐рд░ рдиреАрдЪреЗ рдФрд░ рджрд╛рдИрдВ рдУрд░ рдмрдврд╝рдирд╛ред рд╣рдо рдЗрд╕ рд╕рдВрдпреЛрдЬрди рдХрд╛ рдорд╛рдирдХреАрдХрд░рдг рдХрд░рддреЗ рд╣реИрдВ:

 s #     # 47 тАФ   QWERTY/Dvorak, 15 тАФ    PC  16 тАФ #    Macintosh L #  ; L >= 2 t #   ; t <= L тАУ 1 # ,   3     2   (┬лqaw┬╗) d #  ┬л┬╗        ; #   QWERTY/Dvorak    4,6 (  g тАУ 6 , #   тАУ  1) 


рдлрд┐рд░ рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд╛рди рдореЗрдВ рд▓рдВрдмрд╛рдИ рдПрд▓ рдпрд╛ рдЙрд╕рд╕реЗ рдХрдо рдХреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдХреАрдмреЛрд░реНрдб рд╕рдВрдпреЛрдЬрди рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рдЯреА рдпрд╛ рдХрдо рджрд┐рд╢рд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИрдВ:


рдлрд╝рдВрдХреНрд╢рди " рджреНрд╡рд┐рдкрдж рдЧреБрдгрд╛рдВрдХ рд╕реЗ (i - 1) рд╕реЗ (j - 1) " рд▓рдВрдмрд╛рдИ рдХреЗ рдХреАрдмреЛрд░реНрдб рд╕рдВрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рджрд┐рд╢рд╛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ j рджрд┐рд╢рд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИред "-1" рдХреЛ рджреЛрдиреЛрдВ рддрддреНрд╡реЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рджрд┐рд╢рд╛ рдХрд╛ рдкрд╣рд▓рд╛ рдкрд░рд┐рд╡рд░реНрддрди рд╣рдореЗрд╢рд╛ рдкрд╣рд▓реЗ рдЕрдХреНрд╖рд░ рдкрд░ рд╣реЛрддрд╛ рд╣реИред рдЬреЗ рджрд┐рд╢рд╛рддреНрдордХ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП, рдбреА рд╕рдВрднрд╡ рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдкреНрд░рддреНрдпреЗрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдХреБрд▓ рдбреАрдЬреЗ рд╕рдВрднрд╛рд╡рдирд╛рдПрдВред рдХреНрд░реИрдХрд░ рдХреЛ рд╕рднреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡рд░реНрдгреЛрдВ рдкрд░ рднреА рдЪрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рд╕реВрддреНрд░ рдореЗрдВ рдЧреБрдгрд╛рдВрдХ рд╣реИред рд╕реВрддреНрд░ рд╕реНрд╡рдпрдВ рдмрд╣реБрдд рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИ - рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрдИ рд╡рд┐рдХрд▓реНрдк рдПрдХ рдЕрд╕рд▓реА рдХреАрдмреЛрд░реНрдб рдкрд░ рдЕрд╕рдВрднрд╡ рд╣реИрдВ: рджрд┐рд╢рд╛ 5 рдХреЗ 1 рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рд▓рдВрдмрд╛рдИ 5 рдХреЗ рдХреАрдмреЛрд░реНрдб рд╕рдВрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП, рдСрдкрд░реЗрд╢рди "рдХреНрдпреВ" рдФрд░ "рд▓реЗрдлреНрдЯ рд▓реЗрдлреНрдЯ" рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрд╕рдВрднрд╡ рд╣реИред

рдЗрд╕ рдХреЙрдлреАрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 lg = (n) -> Math.log(n) / Math.log(2) nPk = (n, k) -> return 0 if k > n result = 1 result *= m for m in [n-k+1..n] result nCk = (n, k) -> return 1 if k = 0 k_fact = 1 k_fact *= m for m in [1..k] nPk(n, k) / k_fact spatial_entropy = (match) -> if match.graph in ['qwerty', 'dvorak'] s = KEYBOARD_STARTING_POSITIONS d = KEYBOARD_AVERAGE_DEGREE else s = KEYPAD_STARTING_POSITIONS d = KEYPAD_AVERAGE_DEGREE possibilities = 0 L = match.token.length t = match.turns #      L,  t     for i in [2..L] possible_turns = Math.min(t, i тАУ 1) for j in [1..possible_turns] possibilities += nCk(i тАУ 1, j тАУ 1) * s * Math.pow(d, j) entropy = lg possibilities #   ,     # (%  5, A  a) #     ,  #        # . .   if match.shifted_count S = match.shifted_count U = match.token.length тАУ match.shifted_count #     possibilities = 0 possibilities += nCk(S + U, i) for i in [0..Math.min(S, U)] entropy += lg possibilities entropy 


:

 dictionary_entropy = (match) -> entropy = lg match.rank entropy += extra_uppercasing_entropy match entropy += extra_l33t_entropy match entropy 


тАФ : : , the good , photojournalist maelstrom тАФ . zxcvbn , , , . , correcthorsebatterystaple xkcd zxcvbn (45,2 44 ). xkcd 211 ( 2000 ), zxcvbn . zxcvbn.js , , , .
, ┬л┬╗, , . , , :

 extra_uppercase_entropy = (match) -> word = match.token return 0 if word.match ALL_LOWER #       тАФ  #    , #          ( + # ): #  1   . #           #   , #     ,   , #   ,  1  for regex in [START_UPPER, END_UPPER, ALL_UPPER] return 1 if word.match regex #   ,      #   # U+L     U    # ,   ,   (, PASSwORD), тАФ  #      U+L   L    U = (chr for chr in word.split(тАЭ) when chr.match /[AZ]/).length L = (chr for chr in word.split(тАЭ) when chr.match /[az]/).length possibilities = 0 possibilities += nCk(U + L, i) for i in [0..Math.min(U, L)] lg possibilities 


, 1 ┬л ┬╗ . , :


l33t , .


, , zxcvbn . тАФ : :
 dictionary_match = (password, ranked_dict) -> result = [] len = password.length password_lower = password.toLowerCase() for i in [0...len] for j in [i...len] if password_lower[i..j] of ranked_dict word = password_lower[i..j] rank = ranked_dict[word] result.push( pattern: 'dictionary' i: i j: j token: password[i..j] matched_word: word rank: rank ) result 


Ranked_dict . , , . l33t , dictionary_match. (, bvcxz) , . . matching.coffee github .

рдбреЗрдЯрд╛


, 10 000 , 2011 .

2000 , . zxcvbn Internet Explorer 7, 80 % (. . 80 % , ), тАФ 90 %.

40 000 Wiktionary , 29 . , . , , , (, ), тАФ . , , Frasier 824- .

рдирд┐рд╖реНрдХрд░реНрд╖


, , . , тАФ , ┬л ┬╗ , ( ) . , , . : , , , ( , ).

, . Zxcvbn , ; n-; ; (, qzwxec) . (, ) , , zxcvbn, , тАФ . :

, , , zxcvbn , . , . ┬л┬╗ github !
, , , , , , , , , , , , , , .

ABBYY Language Services

ps ┬л ┬╗, ┬л ┬╗ тАФ .

Source: https://habr.com/ru/post/In149396/


All Articles