рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рд╕рдордп рдкрд╛рд╕рд╡рд░реНрдб

рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛: рдпрд╣ рд▓реЗрдЦ рдкрд┐рдЫрд▓реЗ рд╕рдкреНрддрд╛рд╣ рдХреЗ рджреМрд░рд╛рди рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рд░рд╡рд┐рд╡рд╛рд░ рд░рд╛рдд рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЗрдЦ рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬрд╛ рдЧрдпрд╛ рдерд╛ред рдЖрдЬ рдореБрдЭреЗ рдПрдХ рдЖрдордВрддреНрд░рдг рдорд┐рд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдПрдХ рд╕рдорд╛рди рд╡рд┐рд╖рдп рдХреЗ рд╕рд╛рде рдПрдХ рд▓реЗрдЦ рднреА рдорд┐рд▓рд╛ рд╣реИ - рдореЛрдмрд╛рдЗрд▓ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рджреЛ-рдХрд╛рд░рдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рдореБрджреНрджреЗ рдкрд░ , рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрдХ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕рд╣рдордд рд╣реВрдВ - "рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдВрдпреЛрдЧ рд╣реИрдВред" рдЙрдиреНрд╣реЛрдВрдиреЗ рд▓реЗрдЦ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдХрд▓реНрдкрдирд╛ рдХреА рдЧрдИ рдереА, рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕реВрддреНрд░реЛрдВ рд╕реЗ рдХреЗрд╡рд▓ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝реЗред

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



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

рд╕рд╛рдЗрдЯ рдкрд░ рдкрдВрдЬреАрдХрд░рдг рдХрд░рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдХреНрд░рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:


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

рд╡рд┐рдЪрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Google рдРрдк рдЗрдВрдЬрди + рдПрдХ рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред рд╕рд╛рдЗрдЯ рдХрд╛ рдбреЗрдореЛ рд╕рдВрд╕реНрдХрд░рдг http://grey-box.appspot.com/ рдкрд░ рд╕реНрдерд┐рдд рд╣реИред рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреЗ рдбреЗрдореЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд▓рд┐рдВрдХ рднреА рд╣реИ, 1.6 рдФрд░ рдЙрдЪреНрдЪрддрд░ рдПрдВрдбреНрд░реЙрдЗрдб рдУрдПрд╕ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреЛрдиреЛрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдореИрдВ рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВрдВрдЧрд╛ред

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

рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░, 3 рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП:

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд╛рдпрдерди рдХреЛрдб рдХреЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рднрд╛рдЧ рд╣реИрдВред
#   . import time import hmac from hashlib import sha1 ... OTP_TTL = 300 #    ,   #   username = request.get(тАЬusernameтАЭ) timestamp = int(time.time()) / OTP_TTL #    secret_key = hmac.new(str(timestamp) + username, digestmod=sha1).hexdigest().upper() #       .. 


рдХреНрдпреВрдЖрд░ рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рддрд╕реНрд╡реАрд░ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╡рд┐рдХрд▓реНрдк рд╡рд┐рднрд┐рдиреНрди рдмрд╛рд░рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдРрд╕реА рдХрдИ рд╕реЗрд╡рд╛рдПрдБ рд╣реИрдВ, рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдПрдХ рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдХрд┐ Google Corporation - Google Charts Tools рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рддреА рд╣реИред рдпрд╣ рд╕реЗрд╡рд╛ рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рдЧреНрд░рд╛рдл, рдЪрд╛рд░реНрдЯ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдмрд╛рд░рдХреЛрдб рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╕рд╛рдиреА рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ рдмрд╛рд░рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред

 QR_TPL = "https://chart.googleapis.com/chart?chs=100x100&cht=qr&chl=%s&choe=UTF-8" qr_url = QR_TPL % ('%s:%s' % (secret_key, timestamp)) #      HTML   . ... 


рд╡рди-рдЯрд╛рдЗрдо рдкрд╛рд╕рд╡рд░реНрдб рдЬрдирд░реЗрд╢рдиред

 import time import hmac from hashlib import sha1 тАж OTP_TTL = 300 #    ,   TRUNCATE_MASK = 0x7FFFFFFF #       MOD = 1000000 #         #   username = request.get("username") password = request.get("password") #       st = storage.gql("where user = :1", username).get() secret_key =st.secret_key #  timestamp timestamp = int(time.time()) / OTP_TTL #    ... one_time_password = str((int(hmac.new(secret_key, str(timestamp), sha1).hexdigest(), 16) & TRUNCATE_MASK) % MOD) # ...         if password == one_time_password: #   else: #  


рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдХреА рддрд░рдл, 2 рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:

рдмрд╛рд░рдХреЛрдб рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВ, рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдФрд░ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЬрд╝рдХреНрд╕рд┐рдВрдЧ рдУрдкрди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИред рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрдИ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ Google Android рдФрд░ Apple iOS рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдУрдкрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрд╛рд░рдХреЛрдб рд╕реНрдХреИрдирд░ рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рднреА рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдФрд░ рдЕрдХреНрд╕рд░ рдХрдИ рдирдП рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдорд╛рд░реНрдЯрдлреЛрдиреНрд╕ рдкрд░ рдкреНрд░реАрдЗрдВрд╕реНрдЯреЙрд▓реНрдб рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЗрдВрдЯрд░рдиреЗрдЯ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬ рдкрд░ рд▓рдВрдмреА рдЦреЛрдЬреЛрдВ рдХреЗ рдмрд╛рдж, рдпрд╣ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рдФрд░ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдирд╣реАрдВ рдерд╛ред рдПрдВрдбреНрд░реЙрдЗрдб рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЗрд░рд╛рджреЗ рдХреЙрд▓ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдЖрд╡реЗрджрди рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдмрд╛рд░рдХреЛрдб рд╕реНрдХреИрдирд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдПрдХ рдорд╛рдЗрдирд╕ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд▓рд╕рд╕ рд╣реИрдВ - рдЖрдкрдХреЛ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдореЙрдбрд▓, рд╡рд░реНрддрдорд╛рди рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдЬрд╝рдХреНрд╕рд┐рдВрдЧ рд╡рд┐рдХрд╛рд╕ рджрд▓ рдХрд░рддрд╛ рд╣реИ ред рдЖрдк рдЕрдиреНрдп рдмрд╛рд░рдХреЛрдб рдкрд╣рдЪрд╛рди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рднреА рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдмрд╛рд░рдХреЛрдб рд╕реНрдХреИрдирд░ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИрдВред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬрд╛рд╡рд╛ рдХреЛрдб рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЯреБрдХрдбрд╝рд╛ рд╣реИ рдЬреЛ рдмрд╛рд░рдХреЛрдб рд╕реНрдХреИрдирд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
 ... //  Barcode Scanner Intent,      Intent intent = new Intent("com.google.zxing.client.android.SCAN"); intent.putExtra("SCAN_MODE", "QR_CODE_MODE"); startActivityForResult(intent, 0); ... //           Barcode Scanner public void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == 0) { if (resultCode == RESULT_OK) { //      String contents = intent.getStringExtra("SCAN_RESULT"); // тАж      тАж } } } ... 


рд╡рди-рдЯрд╛рдЗрдо рдкрд╛рд╕рд╡рд░реНрдб рдЬрдирд░реЗрд╢рдиред

 //   import java.math.BigInteger; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; ... // ,       long OTP_TTL = 300; long TRUNCATE_MASK = 0x7FFFFFFF; long MOD = 1000000; ... //     String secret_key = key_storage.getString("secret_key", ""); //     long time_delta = key_storage.getLong("time_delta", 0); long local_time = (System.currentTimeMillis()/1000) / TIME_MASK; long server_time = local_time + time_delta; try { SecretKeySpec keySpec = new SecretKeySpec(secret_key.getBytes(), "HmacSHA1"); Mac mac = Mac.getInstance("HmacSHA1"); mac.init(keySpec); byte[] result = mac.doFinal(Long.toString(server_time).getBytes()); password = Long.toString((new BigInteger(1, result).intValue() & TRUNCATE_MASK) % MOD); } catch (NoSuchAlgorithmException e) { ... } catch (InvalidKeyException e) { ... } //     ... 


рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рд╕рд╛рдЗрдЯ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдФрд░ рдбреЗрдореЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди http://grey-box.appspot.com/ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдЖрдИрдбреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЕрдиреБрдорддрд┐ рдпрд╛ рдПрдХреНрд╕реЗрд╕ рдЕрдзрд┐рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдПрдХрдорд╛рддреНрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдмрд╛рд░рдХреЛрдб рд╕реНрдХреИрдирд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ QR рдХреЛрдб рдХреЛ рд╕реНрдХреИрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд▓рд╣рд╛рд▓, рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдЖрдИрдбреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдиреНрдпреВрдирддрдо рд╣реИ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗрд╡рд▓ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдФрд░ рдХреЗрд╡рд▓ рдбреЗрдореЛ рд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рдХреБрдВрдЬреА рдХреЛ рдмрдЪрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рддрд╣рдд рдкрдВрдЬреАрдХрд░рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЧреБрдкреНрдд рдХреБрдВрдЬреА рдореМрдЬреВрджрд╛ рдПрдХ рдХреЗ рдКрдкрд░ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреА рдЬрд╛рдПрдЧреАред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдЖрдк рд╡рд┐рднрд┐рдиреНрди рд╕рд╛рдЗрдЯреЛрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд╕рдВрд░рдХреНрд╖рдг рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рд╕рдм, рдмреЗрд╢рдХ, рдмрд╢рд░реНрддреЗ рдХрд┐ рдпрд╣ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдпреЛрдЬрдирд╛ рд╡рд┐рддрд░рд┐рдд рд╣реЛред рдореБрдЭреЗ рдХрд┐рд╕реА рднреА рдЯрд┐рдкреНрдкрдгреА рдФрд░ рд╕реБрдЭрд╛рд╡ рдкрд░ рдЦреБрд╢реА рд╣реЛрдЧреАред

рд╕рдВрджрд░реНрдн:
http://ru.wikipedia.org/wiki/QR-%D0%BA%D0%BE%D0%B4 - QR рдХреЛрдб рдХреНрдпрд╛ рд╣реИрдВ
http://en.wikipedia.org/wiki/HOTP - HOTP рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╡рд░реНрдгрди
http://tools.ietf.org/html/rfc4226 - HOTP рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд▓рд┐рдП RFC 4226
https://chart.googleapis.com - Google рдЪрд╛рд░реНрдЯ рдЙрдкрдХрд░рдг
http://code.google.com/p/zxing/ - рд╡рд┐рднрд┐рдиреНрди рдмрд╛рд░рдХреЛрдб рдХреЛ рд╕реНрдХреИрди рдХрд░рдиреЗ рдФрд░ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЬрд╝реЛрдХреНрд╕ рдХрд░рдирд╛ред
http://grey-box.appspot.com/ - рдбреЗрдореЛ рд╕рд╛рдЗрдЯ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрдЗрдбрд┐рдпрд╛ рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред

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

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


All Articles