如何在Doctrine和Symfony 3中启用加密哈希函数(MD5,SHA1和SHA2)

本文概述

  • 实现
  • MD5
  • SHA1
  • SHA2
密码散列函数是一种散列函数, 它接受输入(或” 消息” )并返回固定大小的字母数字字符串, 该字符串称为散列值(有时称为消息摘要, 数字指纹, 摘要或校验和) 。其中最著名的是MD5, SHA1和SHA2之类的功能。
这些函数在MySQL环境中本机可用, 但是在教义中不可用, 如果尝试在查询中访问它们, 则会出错。为了增加这些功能在理论上的可用性, 我们将添加3个理论扩展(每个功能1个扩展), 然后将其注册到config.yml文件中, 最后我们将展示一些使用示例。
注意:本教程适用于Symfony 2.x和Symfony3.x。
实现首先, 请在捆绑包的根文件夹中找到自己, 并创建一个名为Extensions的文件夹(或根目录/ src)(如果不存在)。然后在名为Doctrine的内部创建一个文件夹, 其中将包含该学说的所有扩展类。
而且, 请不要忘记根据项目内部的位置更改每个类的名称空间。
MD5在先前创建的doctrine文件夹中创建一个名为Md5.php的新类, 并将以下代码保存在其中。
< ?phpnamespace myBundle\Extensions\Doctrine; use Doctrine\ORM\Query\AST\Functions\FunctionNode, Doctrine\ORM\Query\Lexer; /** * @author Andreas Gallien < gallien@seleos.de> */class Md5 extends FunctionNode{public $stringPrimary; public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker){return $sqlWalker-> 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属性和类路径保存在ORM的dql属性中即可。
# app/config/config.yml# Doctrine Configurationdoctrine:# Search for the ORM propertyorm:# Those values should be already in your file and this doesn't matterauto_generate_proxy_classes: "%kernel.debug%"naming_strategy: doctrine.orm.naming_strategy.underscoreauto_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 stepMD5: myBundle\Extensions\Doctrine\Md5

你已经准备好出发了!如果你在产品环境中工作, 请清除缓存, 让我们创建一些查询。
MD5用法
MD5函数可供使用, 你可以在查询生成器或纯DQL中使用它。
给定下表Breeds(具有实体Breeds), 找到MD5哈希为” 1″ 的品种。
ID 名称 杂凑
1 阿拉斯加雪橇犬 c4ca4238a0b923820dcc509a6f75849b
然后, 我们可以使用查询生成器(记住, MD5哈希为1的是c4ca4238a0b923820dcc509a6f75849b):
< ?phpclass DefaultController extends Controller{public function indexAction(){$em = $this-> 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在先前创建的doctrine文件夹中创建一个名为Sha1.php的新类, 并将以下代码保存在其中。
< ?phpnamespace myBundle\Extensions\Doctrine; use Doctrine\ORM\Query\AST\Functions\FunctionNode, Doctrine\ORM\Query\Lexer; /** * @author Andreas Gallien < gallien@seleos.de> */class Sha1 extends FunctionNode{public $stringPrimary; public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker){return 'SHA1(' .$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); }}

上一类将允许你在原则查询中使用SHA1函数, 并防止已知错误:
[语法错误]错误:预期的已知功能, 得到’ SHA1′
现在, 该类已存在于我们的项目中, 但尚未注册。为了使用它, 我们需要在我们的项目的config.yml文件中注册该函数, 只需进入主义区域, 并将SHA1属性和类路径保存在ORM的dql属性中即可。
# app/config/config.yml# Doctrine Configurationdoctrine:# Search for the ORM propertyorm:# Those values should be already in your file and this doesn't matterauto_generate_proxy_classes: "%kernel.debug%"naming_strategy: doctrine.orm.naming_strategy.underscoreauto_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 stepSHA1: myBundle\Extensions\Doctrine\Sha1

你已经准备好出发了!如果你在产品环境中工作, 请清除缓存, 让我们创建一些查询。
SHA1用法
SHA1函数可供使用, 你可以在查询生成器或普通DQL中使用它。
给定下表Breeds(具有实体Breeds), 找到SHA1哈希为” 1″ 的品种。
ID 名称 杂凑
1 阿拉斯加雪橇犬 356a192b7913b04c54574d18c28d46e6395428ab
然后我们可以使用查询生成器(请记住, SHA1的1哈希为356a192b7913b04c54574d18c28d46e6395428ab):
< ?phpclass DefaultController extends Controller{public function indexAction(){$em = $this-> 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在先前创建的doctrine文件夹中创建一个名为Sha2.php的新类, 并将以下代码保存在其中。
< ?phpnamespace myBundle\Extensions\Doctrine; use Doctrine\ORM\Query\AST\Functions\FunctionNode, Doctrine\ORM\Query\Lexer; /** * @author Andreas Gallien < gallien@seleos.de> */class Sha2 extends FunctionNode{public $stringPrimary; public $simpleArithmeticExpression; public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker){return 'SHA2(' .$sqlWalker-> 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属性和类路径保存在ORM的dql属性中即可。
# app/config/config.yml# Doctrine Configurationdoctrine:# Search for the ORM propertyorm:# Those values should be already in your file and this doesn't matterauto_generate_proxy_classes: "%kernel.debug%"naming_strategy: doctrine.orm.naming_strategy.underscoreauto_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 stepSHA2: myBundle\Extensions\Doctrine\Sha2

你已经准备好出发了!如果你在产品环境中工作, 请清除缓存, 让我们创建一些查询。
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, 得到了’ )’
给定下表Breeds(具有实体Breeds), 找到SHA2哈希为” 1″ 的品种。
ID 名称 杂凑
1 阿拉斯加雪橇犬 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b
然后我们可以使用查询生成器(请记住, 256个哈希1中的SHA2是6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b):
< ?php class DefaultController extends Controller{public function indexAction(){$em = $this-> 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变量应返回阿拉斯加雪橇犬的行。
免责声明:该学说扩展名是由Github中的beberlei从” 学说扩展名” 存储库中获得的
【如何在Doctrine和Symfony 3中启用加密哈希函数(MD5,SHA1和SHA2)】玩得开心 !

    推荐阅读