Как включить криптографические хеш-функции (MD5, SHA1 и SHA2) в Doctrine и Symfony 3

Криптографическая хеш-функция — это хеш-функция, которая принимает входные данные (или «сообщение») и возвращает буквенно-цифровую строку фиксированного размера, которая называется хеш-значением (иногда ее называют дайджестом сообщения, цифровым отпечатком, дайджестом или контрольной суммой). , Наиболее известными из них являются такие функции, как MD5, SHA1 и SHA2.

Эти функции изначально доступны в среде MySQL, однако недоступны в доктрине, и вы получите ошибки, если попытаетесь получить к ним доступ в своих запросах. Чтобы добавить доступность к этим функциям в доктрине, мы собираемся добавить 3 расширения доктрины (по 1 для каждой функции), затем мы зарегистрируем их в файле config.yml и, наконец, покажем несколько примеров использования.

Замечания: Этот учебник работает как для Symfony 2.x, так и для Symfony 3.x.

Реализация

Чтобы начать, найдите себя в корневой папке вашего пакета и создайте папку с именем расширения (или корневой каталог /srcв случае, если его не существует. Затем создайте папку внутри с именем Doctrine, она будет содержать все классы расширения для Doctrine.

И, пожалуйста, не забудьте изменить пространство имен каждого класса в соответствии с расположением внутри вашего проекта.

MD5

Создать внутри ранее созданного учение папка новый класс с именем Md5.php и сохраните следующий код внутри.

getConnection()->getDatabasePlatform()->getMd5Expression(
$sqlWalker->walkStringPrimary($this->stringPrimary)
);
}
public function parse(\Doctrine\ORM\Query\Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->stringPrimary = $parser->StringPrimary();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
}

Предыдущий класс позволит вам использовать функцию MD5 внутри запроса доктрины и предотвратить известную ошибку:

[Ошибка синтаксиса] Ошибка: ожидаемая известная функция, получил «MD5»

Сейчас класс существует в нашем проекте, но он не зарегистрирован. Чтобы использовать его, нам нужно зарегистрировать функцию в config.yml файл нашего проекта, просто перейдите в область доктрины и сохраните MD5 свойство с путем к классу в свойстве dql ORM.

# app/config/config.yml
# Doctrine Configuration
doctrine:
# Search for the ORM property
orm:
# Those values should be already in your file and this doesn't matter
auto_generate_proxy_classes: "%kernel.debug%"
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
# We need this the dql property to register the custom doctrine functions :
dql:
string_functions:
# Match agains should have the path to the Md5 class created in the previous step
MD5: myBundle\Extensions\Doctrine\Md5

И ты готов к работе! очистить кеш в случае, если вы работаете в среде Prod и давайте создадим несколько запросов.

MD5 Использование

Функция MD5 доступна для использования, вы можете использовать ее в течение построитель запросов или простой DQL.

Учитывая следующую таблицу Породы (с Породами сущностей), найдите породу с хешем MD5 «1».

Я БЫ
НАЗВАНИЕ
HASH
1 Аляскинский маламут c4ca4238a0b923820dcc509a6f75849b

Тогда мы могли бы просто использовать построитель запросов (помните, MD5 хеш 1 является c4ca4238a0b923820dcc509a6f75849b):

getDoctrine()->getManager();
$repository = $em->getRepository("sandboxBundle:Breeds");
$reg = $repo->createQueryBuilder('a')
->where("a.hash = MD5(:id)")
->setParameter('id', 1 )
->getQuery()
->getResult();
dump($reg);
}
}

$reg переменная должна возвращать строку аляскинского маламута.

SHA1

Создать внутри ранее созданного учение папка новый класс с именем Sha1.php и сохраните следующий код внутри.

walkStringPrimary($this->stringPrimary) .
')';
}
public function parse(\Doctrine\ORM\Query\Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->stringPrimary = $parser->StringPrimary();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
}

Предыдущий класс позволит вам использовать функцию SHA1 внутри запроса доктрины и предотвратить известную ошибку:

[Ошибка синтаксиса] Ошибка: ожидаемая известная функция, получил ‘SHA1’

Сейчас класс существует в нашем проекте, но он не зарегистрирован. Чтобы использовать его, нам нужно зарегистрировать функцию в config.yml файл нашего проекта, просто перейдите в область доктрины и сохраните SHA1 свойство с путем к классу в свойстве dql ORM.

# app/config/config.yml
# Doctrine Configuration
doctrine:
# Search for the ORM property
orm:
# Those values should be already in your file and this doesn't matter
auto_generate_proxy_classes: "%kernel.debug%"
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
# We need this the dql property to register the custom doctrine functions :
dql:
string_functions:
# Match agains should have the path to the Sha1 class created in the previous step
SHA1: myBundle\Extensions\Doctrine\Sha1

И ты готов к работе! очистите кеш на случай, если вы работаете в среде prod, и давайте создадим несколько запросов.

Использование SHA1

Функция SHA1 доступна для использования, вы можете использовать ее в построитель запросов или простой DQL.

Учитывая следующую таблицу Породы (с Породами сущностей), найдите породу с хешем SHA1, равным «1».

Я БЫ
НАЗВАНИЕ
HASH
1 Аляскинский маламут 356a192b7913b04c54574d18c28d46e6395428ab

Тогда мы могли бы просто использовать построитель запросов (помните, хеш SHA1 1 является 356a192b7913b04c54574d18c28d46e6395428ab):

getDoctrine()->getManager();
$repository = $em->getRepository("sandboxBundle:Breeds");
$reg = $repo->createQueryBuilder('a')
->where("a.hash = SHA1(:id)")
->setParameter('id', 1 )
->getQuery()
->getResult();
dump($reg);
}
}

$reg переменная должна возвращать строку аляскинского маламута.

SHA2

Создать внутри ранее созданного учение папка новый класс с именем Sha2.php и сохраните следующий код внутри.

walkStringPrimary($this->stringPrimary) .
',' .
$sqlWalker->walkSimpleArithmeticExpression($this->simpleArithmeticExpression) .
')';
}
public function parse(\Doctrine\ORM\Query\Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->stringPrimary = $parser->StringPrimary();
$parser->match(Lexer::T_COMMA);
$this->simpleArithmeticExpression = $parser->SimpleArithmeticExpression();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
}

Предыдущий класс позволит вам использовать функцию SHA2 внутри запроса доктрины и предотвратить известную ошибку:

[Ошибка синтаксиса] Ошибка: ожидаемая известная функция, получил ‘SHA2’

Сейчас класс существует в нашем проекте, но он не зарегистрирован. Чтобы использовать его, нам нужно зарегистрировать функцию в config.yml файл нашего проекта, просто перейдите в область доктрины и сохраните SHA2 свойство с путем к классу в свойстве dql ORM.

# app/config/config.yml
# Doctrine Configuration
doctrine:
# Search for the ORM property
orm:
# Those values should be already in your file and this doesn't matter
auto_generate_proxy_classes: "%kernel.debug%"
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
# We need this the dql property to register the custom doctrine functions :
dql:
string_functions:
# Match agains should have the path to the Sha2 class created in the previous step
SHA2: myBundle\Extensions\Doctrine\Sha2

И ты готов к работе! очистите кеш на случай, если вы работаете в среде prod, и давайте создадим несколько запросов.

Использование SHA2

Функция SHA2 доступна для использования, вы можете использовать ее в построитель запросов или простой DQL. Помните, что функция SHA2 вычисляет семейство хеш-функций SHA-2 (SHA-224, SHA-256, SHA-384 и SHA-512). первый аргумент строка открытого текста, которую нужно хэшировать второй аргумент указывает желаемую длину в битах результата, которая должна иметь значение 224, 256, 384, 512 или 0 (что эквивалентно 256). Если один из аргументов равен NULL или длина хеша не является одним из допустимых значений, возвращаемое значение равно NULL. В противном случае результатом функции является хеш-значение, содержащее желаемое количество битов.

Если мы не предоставим второй параметр в инструкции доктрины, мы получим следующее сообщение об ошибке:

[Ошибка синтаксиса] Ошибка: ожидаемый Doctrine \ ORM \ Query \ Lexer :: T_COMMA, получил ‘)’

Учитывая следующую таблицу Пород (с Породами сущностей), найдите породу с хешем SHA2 «1».

Я БЫ
НАЗВАНИЕ
HASH
1 Аляскинский маламут 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b

Тогда мы могли бы просто использовать построитель запросов (помните, SHA2 в 256 хэш из 1 является 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b):

getDoctrine()->getManager();
$repository = $em->getRepository("sandboxBundle:Breeds");
$reg = $repo->createQueryBuilder('a')
// Read about SHA2 MYSQL : https://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html#function_sha2
// The hash is stored with SHA2-256, therefore the second parameter of SHA2 is 256
->where("a.hash = SHA2(:id,256)")
->setParameter('id', 1 )
->getQuery()
->getResult();
dump($reg);
}
}

$reg переменная должна возвращать строку аляскинского маламута.

Отказ от ответственности: расширение доктрины было получено из Хранилище Doctrine Extensions от Беберлей в Гитхубе

Повеселись !

Ссылка на основную публикацию