Skip to content

Commit

Permalink
feature #19843 [Security] Allow run-time configuration of hash algo (…
Browse files Browse the repository at this point in the history
…nicolas-grekas)

This PR was merged into the 3.2-dev branch.

Discussion
----------

[Security] Allow run-time configuration of hash algo

| Q             | A
| ------------- | ---
| Branch?       | master
| New feature?  | yes
| Tests pass?   | yes
| Fixed tickets | -
| License       | MIT
| Doc PR        | -

Required if we want run-time config with env vars. See #19681

Commits
-------

7903a46 [Security] Allow run-time configuration of hash algo
  • Loading branch information
fabpot committed Sep 14, 2016
2 parents e5088ac + 7903a46 commit 5129c4c
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 14 deletions.
Expand Up @@ -493,15 +493,8 @@ private function createEncoder($config, ContainerBuilder $container)
);
}

// message digest encoder
return array(
'class' => 'Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder',
'arguments' => array(
$config['algorithm'],
$config['encode_as_base64'],
$config['iterations'],
),
);
// run-time configured encoder
return $config;
}

// Parses user providers and returns an array of their ids
Expand Down
Expand Up @@ -191,12 +191,22 @@ public function testEncoders()
'arguments' => array(false),
),
'JMS\FooBundle\Entity\User2' => array(
'class' => 'Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder',
'arguments' => array('sha1', false, 5),
'algorithm' => 'sha1',
'encode_as_base64' => false,
'iterations' => 5,
'hash_algorithm' => 'sha512',
'key_length' => 40,
'ignore_case' => false,
'cost' => 13,
),
'JMS\FooBundle\Entity\User3' => array(
'class' => 'Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder',
'arguments' => array('md5', true, 5000),
'algorithm' => 'md5',
'hash_algorithm' => 'sha512',
'key_length' => 40,
'ignore_case' => false,
'encode_as_base64' => true,
'iterations' => 5000,
'cost' => 13,
),
'JMS\FooBundle\Entity\User4' => new Reference('security.encoder.foo'),
'JMS\FooBundle\Entity\User5' => array(
Expand Down
2 changes: 1 addition & 1 deletion src/Symfony/Bundle/SecurityBundle/composer.json
Expand Up @@ -17,7 +17,7 @@
],
"require": {
"php": ">=5.5.9",
"symfony/security": "~3.1,>=3.1.2",
"symfony/security": "~3.2",
"symfony/http-kernel": "~3.1",
"symfony/polyfill-php70": "~1.0"
},
Expand Down
40 changes: 40 additions & 0 deletions src/Symfony/Component/Security/Core/Encoder/EncoderFactory.php
Expand Up @@ -69,6 +69,9 @@ public function getEncoder($user)
*/
private function createEncoder(array $config)
{
if (isset($config['algorithm'])) {
$config = $this->getEncoderConfigFromAlgorithm($config);
}
if (!isset($config['class'])) {
throw new \InvalidArgumentException(sprintf('"class" must be set in %s.', json_encode($config)));
}
Expand All @@ -80,4 +83,41 @@ private function createEncoder(array $config)

return $reflection->newInstanceArgs($config['arguments']);
}

private function getEncoderConfigFromAlgorithm($config)
{
switch ($config['algorithm']) {
case 'plaintext':
return array(
'class' => PlaintextPasswordEncoder::class,
'arguments' => array($config['ignore_case']),
);

case 'pbkdf2':
return array(
'class' => Pbkdf2PasswordEncoder::class,
'arguments' => array(
$config['hash_algorithm'],
$config['encode_as_base64'],
$config['iterations'],
$config['key_length'],
),
);

case 'bcrypt':
return array(
'class' => BCryptPasswordEncoder::class,
'arguments' => array($config['cost']),
);
}

return array(
'class' => MessageDigestPasswordEncoder::class,
'arguments' => array(
$config['algorithm'],
$config['encode_as_base64'],
$config['iterations'],
),
);
}
}

0 comments on commit 5129c4c

Please sign in to comment.