рдПрдХ рдмрд╛рд░ рдХрд╛ рдкрд╛рд╕рд╡рд░реНрдб рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐


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

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

рд╣реИрд╢ рдлрдВрдХреНрд╢рди


рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рд▓рдВрдмрд╛рдИ рдХрд╛ рдХреЛрдИ рднреА рдбреЗрдЯрд╛ рд▓реЗрдиреЗ рдФрд░ рдЙрди рдкрд░ рдПрдХ рдЫреЛрдЯрд╛ "рдбрд┐рдЬрд┐рдЯрд▓ рдлрд┐рдВрдЧрд░рдкреНрд░рд┐рдВрдЯ" рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рдорд╛рди рдХреА рд▓рдВрдмрд╛рдИ рд╕реНрд░реЛрдд рдкрд╛рда рдХреА рд▓рдВрдмрд╛рдИ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ; рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реЛрдХрдкреНрд░рд┐рдп SHA-1 рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕ рдлрд┐рдВрдЧрд░рдкреНрд░рд┐рдВрдЯ рдХреА рд▓рдВрдмрд╛рдИ 160 рдмрд┐рдЯреНрд╕ рд╣реИред

рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдПрдХ рдорд╛рди рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рд▓рдВрдмрд╛рдИ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╕реНрд░реЛрдд рдкрд╛рда рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЖрдк рдкрд╣рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб рд▓реЙрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рд░рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рд╣рдо рд╕рднреА рдкрд╣рд┐рдпреЛрдВ рдХреЛ "рд╢реВрдиреНрдп" рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдкрд╛рда рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреНрд░рддреНрдпреЗрдХ рдЕрдХреНрд╖рд░ рдХреЗ рд▓рд┐рдП рдкрд╣рд┐рдпреЛрдВ рдХреЛ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддреЗ рд╣реИрдВред рдЕрдВрдд рдореЗрдВ рд▓реЙрдХ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рдВрдЦреНрдпрд╛ рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдорд╛рди рд╣реИред рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг MD5, SHA-1, GOST_P_34.11-94 рд╣реИрдВред

рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╣реИрд╢ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рди рдХрд░реЗрдВ, рдорд╛рдирдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╛рдпрдерди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ):

import hashlib print hashlib.sha1("Hello, Bob!").hexdigest() 

: 88192e3e2e83243887410897efd90287b8e453a7

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

 import hashlib print hashlib.sha1("Hello, Bob?").hexdigest() 

: cbad4b0e05703acf2e8572be7438830fe7f8ddf5


рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рдЙрди рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдЕрдЦрдВрдбрддрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдПрдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рдЗрдЪреНрдЫрд╛ рд╣реИ рдЬреЛ рдРрд▓рд┐рд╕ рдмреЙрдм рдХреЛ рднреЗрдЬрддреЗ рд╣реИрдВ: рдРрд▓рд┐рд╕ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрджреЗрд╢ рдХреЗ рд▓рд┐рдП SHA-1 рдорд╛рди рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ рд▓рд┐рдлрд╛рдлреЗ рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ; рдмреЙрдм рдиреЗ рдкрд╛рда рдХреЗ SHA-1 рдХреА рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЧрдгрдирд╛ рдХреА, рдПрд▓рд┐рд╕рд┐рди рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрджреЗрд╢ рдХреЛ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдХрд╣реАрдВ рдирд╣реАрдВ рдмрджрд▓рд╛ рдЧрдпрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдореИрд▓реЛрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЧрдП, рдЬреЛ рдПрд▓рд┐рд╕ рдФрд░ рдмреЙрдм рдХреЗ рдмреАрдЪ рдХрд╣реАрдВ рд╣реИ, рдЙрдирдХреЗ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд▓рд┐рдлрд╛рдлреЗ рдЦреЛрд▓рддрд╛ рд╣реИ! рд╡рд╣ рд╕рдВрджреЗрд╢ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЙрд╕рдХреЗ рд▓рд┐рдП SHA-1 рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдкрддреНрд░ рдХреЛ рд╕рдВрд▓рдЧреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ; рдмреЙрдм рдореВрд▓реНрдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдЧрд╛ рдФрд░ рдХреБрдЫ рднреА рдиреЛрдЯрд┐рд╕ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдкреНрд░рдорд╛рдгреАрдХрд░рдг


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

рдПрдХ рдЙрджрд╛рд╣рд░рдг:

 import hashlib print hashlib.sha1("Secret" + "Hello, Bob").hexdigest() 

: 99beeff3ef1971d2cb1be129f986739f6bcba8cc

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред рд╣рд╛рдВ, рдореЗрд▓реЛрд░реА рд╕рдВрджреЗрд╢ рдХреЗ рд╢рд░реАрд░ рдХреЛ рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди (рдЪреВрдВрдХрд┐ рд╡рд╣ рд╡рд░реНрддрдорд╛рди рдкрд╛рда рд╕реЗ рд╣реИрд╢ рдЬрд╛рдирддрд╛ рд╣реИ), рд╡рд╣ рд╣рдореЗрд╢рд╛ "рдкреАрдПрд╕ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╕рдм рдмрдХрд╡рд╛рд╕ рд╣реИ, рд╣рдореЗрдВ рдЫреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛, рдмреЙрдм" рдФрд░ рдмрд╕ рд╢реЗрд╖ рд╕реЗ рд╣реИрд╢ рдХреЛ рдЧрд┐рдиреЗрдВ (рдпрд╛рдж рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рдпрд╛рдж рд░рдЦреЗрдВ) рд╕рдВрдпреЛрдЬрди рддрд╛рд▓рд╛)ред

рдЗрд╕рд╕реЗ рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЛ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рдХрд░реЗрдВрдЧреЗ:

 print hashlib.sha1("Secret" + hashlib.sha1("Hello, Bob").hexdigest()).hexdigest() 

: 3f51e9fc540676bc3ce54367fd3e467f3299c743

рдЕрдм рд╕рдВрджреЗрд╢ рдХреЗ рдЕрдВрдд рдореЗрдВ рдХреБрдЫ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ SHA-1 рдореЗрдВ "рдмрд╛рд╣рд░реА" рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдореЗрд▓рд░реА рдЦреЗрд▓ рд╕реЗ рдмрд╛рд╣рд░ рд░рд╣реЗрдЧреАред

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

рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ HMAC рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рди рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рдирдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, HMAC-SHA1

 import hmac import hashlib print hmac.new(key="Secret", msg="Hello, Bob", digestmod=hashlib.sha1).hexdigest() 

рдПрдХ рдмрд╛рд░ рдХрд╛ рдкрд╛рд╕рд╡рд░реНрдб


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

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

рдЗрд╕ рдпреЛрдЬрдирд╛ рдХреЛ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рдХреНрд░рдо рдореЗрдВ рдЕрдкрдиреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдПрдХ рдЧреБрдкреНрдд рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрддрд╛ рджреЗрдВ рдХрд┐ рдРрд▓рд┐рд╕ рдФрд░ рдмреЙрдм рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдЧреБрдкреНрдд рд╕рдВрдЦреНрдпрд╛ 42 рд╣реИ; рдлрд┐рд░ рдкрд╣рд▓рд╛ рдкрд╛рд╕рд╡рд░реНрдб 42, рджреВрд╕рд░рд╛ 84, рддреАрд╕рд░рд╛ 126 рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХрд╛ рд╣реЛрдЧрд╛ред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдФрд░ рдЧреБрдкреНрдд рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирдиреЗ рд╡рд╛рд▓рд╛ рдореЗрд▓реЛрд░реА, рдХрднреА рднреА рдпрд╣ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛рдПрдЧрд╛ рдХрд┐ рдЕрдЧрд▓рд╛ рдкрд╛рд╕рд╡рд░реНрдб рдХреМрди рд╕рд╛ рд╣реЛрдЧрд╛!

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

 import hmac import hashlib print hmac.new(key="Secret", msg="20", digestmod=hashlib.sha1).hexdigest() 

: 393e9efaae1a687bc2dcc257c8e9e2a61f26fe4b

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

рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдареАрдХ рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдЬрдм рддрдХ рдмреЙрдм рдФрд░ рдРрд▓рд┐рд╕ рдЧрд┐рдирддреА рдХреЗ рдердХ рдирд╣реАрдВ рдЬрд╛рддреЗ, рддрдм рддрдХ рд╡реЗ рдХрд┐рд╕ рддрд░рд╣ рдХреЗ рдкрд╛рд╕рд╡рд░реНрдб рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВред рдХреЛрдИ рдЙрдиреНрд╣реЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрдЬрд╛рдп рдПрдЪрдПрдордПрд╕реА () рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рдЙрди рд╕рднреА рдЪреАрдЬреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдРрд▓рд┐рд╕ рдФрд░ рдмреЙрдм рдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рд╛рде рдкрд╣реБрдВрдЪ рд╣реИ ... рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд░реНрддрдорд╛рди рд╕рдордп!

рд╣рдорд╛рд░реЗ рдирд╛рдпрдХ рдЕрдкрдиреА рдШрдбрд╝рд┐рдпреЛрдВ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рд╣рдордд рд╣реЛрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдпреВрдирд┐рдХреНрд╕ рд╕рдордп (рдпреВрдЯреАрд╕реА) рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рдмрд╛рдж рд╕реЗ рдПрдЪрдПрдордПрд╕реА () рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдпреВрдирд┐рдХреНрд╕ рд╕рдордп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╣рдбрд╝рдмрдбрд╝реА рдХреЗ рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡реЗ рд╕рдордп рдХреЛ 30 рд╕реЗрдХрдВрдб "рд╡рд┐рдВрдбреЛ" рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ; рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рд╣реА рдкрд╛рд╕рд╡рд░реНрдб 30 рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рд╣реИред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, 30 рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдкрд╛рд╕рд╡рд░реНрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдРрд▓рд┐рд╕ рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ (рдмрд╕ рдЗрд╕реЗ рдпрд╛рдж рдХрд░ рд░рд╣рд╛ рд╣реИ) рдФрд░ рдЗрд╕ рддрд░рд╣ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдПрдХ рдмрд╛рд░" рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред

рдЕрдм рдкрд╛рд╕рд╡рд░реНрдб рдХреА рдЧрдгрдирд╛ рдирд┐рдореНрди рд╕реВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреА рдЬрд╛рддреА рд╣реИ: HMAC ("рдЧреБрдкреНрдд", unix_timestamp / 30) ред

рд╣рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд╕рдордп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рди-рдЯрд╛рдЗрдо рдкрд╛рд╕рд╡рд░реНрдб рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖред рдХреЗрд╡рд▓ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдХреБрдВрдЬреА рд╣реИ рд╡реЗ рдЗрди рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ "рдЧреБрдкреНрдд"); рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╕рд░реНрд╡рд░ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ред

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

OATH, TOTP, HOTP, RFC ... WTF?


рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдХреЗрд╡рд▓ рдореВрд▓ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИ:

1) HMAC, рд╣реИрд╢-рдЖрдзрд╛рд░рд┐рдд рд╕рдВрджреЗрд╢ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЛрдб: RFC2104
2) HOTP, рд╣реИрд╢-рдЖрдзрд╛рд░рд┐рдд рд╡рди-рдЯрд╛рдЗрдо рдкрд╛рд╕рд╡рд░реНрдб: RFC4226
3) рдЯреАрдУрдЯреАрдкреА, рдЯрд╛рдЗрдо-рдмреЗрд╕реНрдб рд╡рди-рдЯрд╛рдЗрдо рдкрд╛рд╕рд╡рд░реНрдб: RFC6238

рдпреЗ рд╡рд┐рдЪрд╛рд░ рдЗрдирд┐рд╢рд┐рдПрдЯрд┐рд╡ рдлреЙрд░ рдУрдкрди рдСрдереЗрдВрдЯрд┐рдХреЗрд╢рди (OATH) рдкрд╣рд▓ рдХреЗ рдПрдХ рдХреЛрдиреЗ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдорд╛рдирдХ рдмрдирд╛рдирд╛ рд╣реИред

Google 2-рдЪрд░рдгреАрдп рд╕рддреНрдпрд╛рдкрди


Google рдкреНрд░рдорд╛рдгрдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ Google рджреНрд╡рд╛рд░рд╛ рд╕рдордп-рд╕рдордп рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдкрд╛рд╕рд╡рд░реНрдб (TOTP RFC 6238 рдПрд▓реНрдЧреЛрд░рд┐рдердо рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдЧрдгрдирд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ iOS, Android, BlackBerry рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣рд░ 30 рд╕реЗрдХрдВрдб рдореЗрдВ (Google рдЦрд╛рддреЗ рдкрд░ рдореБрдЦреНрдп рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рдЕрд▓рд╛рд╡рд╛) рдПрдХ рдмрд╛рд░ рдкрд╛рд╕рд╡рд░реНрдб рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдХреЛрдИ рдЖрдкрдХреЗ рдкреНрд░рд╛рдердорд┐рдХ рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ рд╕реНрдиреВрдк рдпрд╛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рддрд╛ рд╣реИ, рддреЛ рднреА рдЕрдЧрд▓реЗ рд╡рди-рдЯрд╛рдЗрдо рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рдмрд┐рдирд╛ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХред

рдзреНрдпрд╛рди рджреЗрдВ : рдореИрдВ GOOGLE рдХреЗ рджреЛ-рдЪрд░рдг рд╕реНрд╡рдЪрд╛рд▓рди рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдФрд░ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЬрд╡рд╛рдмрджреЗрд╣реА рдирд╣реАрдВ рд╣реИ; рдЖрдк рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ рдЬреЛрдЦрд┐рдо рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ ред

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

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЧреБрдкреНрдд рдХреБрдВрдЬреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рди-рдЯрд╛рдЗрдо рдкрд╛рд╕рд╡рд░реНрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ рдЦрд╛рддрд╛ рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ Google рдкреНрд░рдорд╛рдгрдХ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреГрд╖реНрда рдкрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ QR рдХреЛрдб рдХреЗ рдЕрдВрддрд░реНрдЧрдд рд╕реНрдерд┐рдд рд╣реИ:



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

Base32 рдореЗрдВ рдХреБрдВрдЬреА рдХреЛ рдЗрдирдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рд╣рдЯрд╛ рджреЗрдВ рдФрд░ рдКрдкрд░реА рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдХреНрд╖рд░реЛрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдВ)ред

рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЬреЛ рд╡рд░реНрддрдорд╛рди рд╡рди-рдЯрд╛рдЗрдо рдкрд╛рд╕рд╡рд░реНрдб рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ:

 import time import hmac import hashlib import base64 ### TOTP-key (get it from Google) secret = base64.b32decode("AABCDEFABCDEFABC") ### Calc counter from UNIX time (see RFC6238) counter = long(time.time() / 30) ### Use counter as 8 byte array bytes=bytearray() for i in reversed(range(0, 8)): bytes.insert(0, counter & 0xff) counter >>= 8 ### Calculate HMAC-SHA1(secret, counter) hs = bytearray(hmac.new(secret, bytes, hashlib.sha1).digest()) ### Truncate result (see RFC4226) n = hs[-1] & 0xF result = (hs[n] << 24 | hs[n+1] << 16 | hs[n+2] << 8 | hs[n+3]) & 0x7fffffff ### Print last 6 digits print str(result)[-6:] 

рдЕрдм рдЖрдк рдЖрдЧреЗ рдЪрд▓ рд░рд╣реЗ Google рдкреНрд░рдорд╛рдгрдХ рдХреЛ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдкрдбреЗрдЯ: рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрджрд╛рд╣рд░рдг (рдзрдиреНрдпрд╡рд╛рдж roman_pro )

рдЕрдкрдбреЗрдЯ # 2: рдпрджрд┐ рдЖрдк рдбреНрд░реЙрдкрдмреЙрдХреНрд╕ рд╕реЗ 2-рдЪрд░рдгреАрдп рд╕рддреНрдпрд╛рдкрди рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЧреБрдкреНрдд рдХреЗ рдЕрдВрдд рдореЗрдВ "======" рдЬреЛрдбрд╝реЗрдВ (рдпрд╣ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрдбрд┐рдВрдЧ рдФрд░ рдмреЗрд╕ 32 рдбрд┐рдХреЛрдбрд░ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ)ред

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


  1. рд╡рди-рдЯрд╛рдЗрдо рдкрд╛рд╕рд╡рд░реНрдб рдЖрд╕рд╛рди рд╣реИрдВред
  2. рдорд╛рдирдХ рдЕрдЪреНрдЫреЗ рд╣реИрдВред
  3. рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реЛ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрд╕реА Google рдкреНрд░рдорд╛рдгрдХ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рд╕реЗ рддреИрдпрд╛рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)ред

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


All Articles