рдПрд╕реНрдХреЗрдк рд╕реНрдЯреВрдбрд┐рдпреЛ, рд╕рд┐рдореНрдлрдиреА 2 рд╕реЗ wsse- рдСрдереЗрдВрдЯрд┐рдХреЗрд╢рди-рдмрдВрдбрд▓ рдореЗрдВ Sha512 рд╕рдкреЛрд░реНрдЯ

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдХрд╛рд░реНрдп рдПрдХ рдЯреЛрдХрди рдмрдирд╛рддреЗ рд╕рдордп рд╕реБрд░рдХреНрд╖рд╛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде sha512 рд╕рдорд░реНрдерди рднреА рдерд╛ред рдпрд╣ рд▓реЗрдЦ рд╕рдВрдХреАрд░реНрдг рд░реВрдк рд╕реЗ рдХреЗрдВрджреНрд░рд┐рдд рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХрдорд╛рддреНрд░ рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реВрдВред

Symfony2 рдкрд░ рдСрдирд▓рд╛рдЗрди рд╕реНрдЯреЛрд░ рдХреЗ рдПрдкреАрдЖрдИ рдХреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп рд╡рд░реНрддрдорд╛рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрд╕рдиреЗ рджреЛрд╕реНрддреЛрдВ рдХреЛ F5UserBundle рдФрд░ WSSEAuthenticationBundle рдХреЛ sha512 рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рд╛рде рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ рдЬрд▓реНрдж рд╣реА рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдкрд░рд┐рд╢реНрд░рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЗрд╕ рдкрд░ рдореЗрд░реЗ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред

рдореВрд▓ рд╕реЗрдЯрд┐рдВрдЧреНрд╕:


app/config/config.yml fos_user: db_driver: orm firewall_name: wsse_secured user_class: Acme\DemoBundle\Entity\User # Escape WSSE authentication configuration escape_wsse_authentication: authentication_provider_class: Escape\WSSEAuthenticationBundle\Security\Core\Authentication\Provider\Provider authentication_listener_class: Escape\WSSEAuthenticationBundle\Security\Http\Firewall\Listener authentication_entry_point_class: Escape\WSSEAuthenticationBundle\Security\Http\EntryPoint\EntryPoint authentication_encoder_class: Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder app/config/security.yml security: providers: fos_userbundle: id: fos_user.user_provider.username encoders: FOS\UserBundle\Model\UserInterface: sha512 firewalls: wsse_secured: pattern: ^/api/.* wsse: lifetime: 300 #lifetime of nonce realm: "Secured API" #identifies the set of resources to which the authentication information will apply (WWW-Authenticate) profile: "UsernameToken" #WSSE profile (WWW-Authenticate) encoder: #digest algorithm algorithm: sha512 encodeHashAsBase64: true iterations: 1 anonymous: true 


рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдЯреЛрдХрди рдкреАрдврд╝реА рдХреЛрдб:


 src\Acme\DemoBundle\Controller\SecurityController.php //... $created = date('c'); $nonce = substr(md5(uniqid('nonce_', true)), 0, 16); $nonceHigh = base64_encode($nonce); $salted = $nonce . $created . $user->getPassword() . "{" . $user->getSalt() . "}"; $passwordDigest = hash('sha512', $salted, true); $header = "UsernameToken Username=\"{$username}\", PasswordDigest=\"{$passwordDigest}\", Nonce=\"{$nonceHigh}\", Created=\"{$created}\""; $view->setHeader("Authorization", 'WSSE profile="UsernameToken"'); $view->setHeader("X-WSSE", "UsernameToken Username=\"{$username}\", PasswordDigest=\"{$passwordDigest}\", Nonce=\"{$nonceHigh}\", Created=\"{$created}\""); $data = array('WSSE' => $header); //... 

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдЗрд╕рдХрд╛ рдХрд╛рд░рдгред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ Escapestudios рд╕реЗ рдорд╛рдирдХ рдкреНрд░рджрд╛рддрд╛ рдореЗрдВ рдРрд╕реА рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ:
 WSSEAuthenticationBundle/Security/Core/Authentication/Provider/Provider.php //... //validate secret $expected = $this->encoder->encodePassword( sprintf( '%s%s%s', base64_decode($nonce), $created, $secret ), "" ); 

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

 src\Acme\DemoBundle\Security\Authentication\Provider\WsseProvider.php namespace Acme\DemoBundle\Security\Authentication\Provider; use Escape\WSSEAuthenticationBundle\Security\Core\Authentication\Provider\Provider; use Symfony\Component\Security\Core\Authentication\Provider\AuthenticationProviderInterface; use Symfony\Component\Security\Core\Exception\CredentialsExpiredException; use Symfony\Component\Security\Core\Exception\NonceExpiredException; /** * Class WsseProvider * @package Acme\DemoBundle\Security\Authentication\Provider */ class WsseProvider extends Provider implements AuthenticationProviderInterface { /** * @param $user \Symfony\Component\Security\Core\User\UserInterface * @param $digest * @param $nonce * @param $created * @param $secret * * @return bool * @throws \Symfony\Component\Security\Core\Exception\CredentialsExpiredException * @throws \Symfony\Component\Security\Core\Exception\NonceExpiredException */ protected function validateDigest($user, $digest, $nonce, $created, $secret) { //check whether timestamp is not in the future if (strtotime($created) > time()) { throw new CredentialsExpiredException('Future token detected.'); } //expire timestamp after specified lifetime if (time() - strtotime($created) > $this->getLifetime()) { throw new CredentialsExpiredException('Token has expired.'); } //validate that nonce is unique within specified lifetime //if it is not, this could be a replay attack if ($this->getNonceCache()->contains($nonce)) { throw new NonceExpiredException('Previously used nonce detected.'); } $this->getNonceCache()->save($nonce, time(), $this->getLifetime()); //validate secret $expected = $this->getEncoder()->encodePassword( sprintf( '%s%s%s', base64_decode($nonce), $created, $secret ), $user->getSalt() ); return $digest === $expected; } } 

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

рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
 app/config/config.yml # Escape WSSE authentication configuration escape_wsse_authentication: authentication_provider_class: Acme\DemoBundle\Security\Authentication\Provider\WsseProvider authentication_listener_class: Escape\WSSEAuthenticationBundle\Security\Http\Firewall\Listener authentication_entry_point_class: Escape\WSSEAuthenticationBundle\Security\Http\EntryPoint\EntryPoint authentication_encoder_class: Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder 

рдЕрдм рд╣рдо рдбрд┐рдлреЗрдВрд╕ рдХреЛ рдереЛрдбрд╝рд╛ рд╕реБрдзрд╛рд░реЗрдВред рдПрдирдХреЛрдбрд░ рдХреА рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рдРрд╕рд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ:
 app/config/security.yml security: firewalls: wsse_secured: wsse: encoder: #digest algorithm iterations: 1 

рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдЯреЛрдХрди рдХреЗ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ / рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рд╣реИрд╢ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ "1" рд╣реИред рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, рдЬрдм Symfony2 рдореЗрдВ рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рд╣реИрд╢рд┐рдВрдЧ, рдпрд╣ "5000" (рд╕рд┐рдореНрдлрдиреА \ рдШрдЯрдХ \ рд╕реБрд░рдХреНрд╖рд╛ \ рдХреЛрд░ \ рдПрдирдХреЛрдбрд░ \ MessageDigestPasswordEncoder) рд╣реИред

рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдпрдВрддреНрд░рдХ рдФрд░ рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рдХреБрдЫ рдмрджрд▓рд╛рд╡ рдХрд░реЗрдВрдЧреЗ:
 app/config/security.yml parameters: wsse_iterations: 300 security: firewalls: wsse_secured: wsse: encoder: #digest algorithm iterations: %wsse_iterations% src\Acme\DemoBundle\Controller\SecurityController.php //... $created = date('c'); $nonce = substr(md5(uniqid('nonce_', true)), 0, 16); $nonceHigh = base64_encode($nonce); $container = $this->get('service_container'); $iterations = $container->getParameter('wsse_iterations'); $salted = $nonce . $created . $user->getPassword() . "{" . $user->getSalt() . "}"; $passwordDigest = hash('sha512', $salted, true); for ($i = 1; $i < $iterations; $i++) { $passwordDigest = hash('sha512', $passwordDigest . $salted, true); } $passwordDigest = base64_encode($passwordDigest); $header = "UsernameToken Username=\"{$username}\", PasswordDigest=\"{$passwordDigest}\", Nonce=\"{$nonceHigh}\", Created=\"{$created}\""; $view->setHeader("Authorization", 'WSSE profile="UsernameToken"'); $view->setHeader( "X-WSSE", "UsernameToken Username=\"{$username}\", PasswordDigest=\"{$passwordDigest}\", Nonce=\"{$nonceHigh}\", Created=\"{$created}\"" ); $data = array('WSSE' => $header); //... 

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

рдореИрдВ рдЖрдкрдХреЛ рдбрд┐рдЬрд┐рдЯреЛрд╡ рдмрд┐рдЬрдиреЗрд╕ рд╕реНрдХреВрд▓ рд╕реЗ рд╡реЗрдм рд╡рд┐рдХрд╛рд╕ рдХреЗ рдкрд╛рдареНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ рдореИрдВ рд╕рд┐рдЦрд╛рддрд╛ рд╣реВрдВ : рдореИрдВ рдПрдХ рдЬреВрдирд┐рдпрд░ PHP рдбреЗрд╡рд▓рдкрд░ рдмрдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ! (рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП), рд╕рд┐рдореНрдлрдиреА 2. рд▓рдЪреАрд▓реЗ рд╡рд┐рдХрд╛рд╕ (рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рдХреЗ рд▓рд┐рдП), рд╕рд╛рде рд╣реА рд╕рд╛рде рдореЗрд░реЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП: рдкрд╛рдпрдерди / Django (рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП) рдФрд░ рд░реВрдмреА рдкрд░ рдкрдЯрд░рд┐рдпреЛрдВ рдореЗрдВ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдХрд╛рд╕ ред рдкреЗрд╢реЗрд╡рд░ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рд░реЗрд▓ рдкрд░ (рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП)ред рдЕрднреА рдкрд╛рдареНрдпрдХреНрд░рдореЛрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВ рдФрд░ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЫреВрдЯ рдкрд░ рдЦрд░реАрдж рд╕рдХрддреЗ рд╣реИрдВ

рд╕рд░реНрдЧреЗрдИ рд╣рд╛рд░реНрд▓рд╛рдирдЪреБрдХ, рд╡рд░рд┐рд╖реНрда PHP рдбреЗрд╡рд▓рдкрд░ / рдЯреАрдо рд▓реАрдб, рдПрд╕рдИрд╕реАрдПрд▓ рдЧреНрд░реБрдк / рдЗрдВрдЯрд░рдиреЗрдЯ рд╕реЗрд▓реНрд╕ рдЯреЗрдХреНрдиреЛрд▓реЙрдЬреАрдЬ рджреНрд╡рд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛

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


All Articles