个性化阅读
专注于IT技术分析

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

本文概述

密码散列函数是一种散列函数, 它接受输入(或”消息”)并返回固定大小的字母数字字符串, 该字符串称为散列值(有时称为消息摘要, 数字指纹, 摘要或校验和) 。其中最著名的是MD5, SHA1和SHA2之类的功能。

这些函数在MySQL环境中本机可用, 但是在教义中不可用, 如果尝试在查询中访问它们, 则会出错。为了增加这些功能在理论上的可用性, 我们将添加3个理论扩展(每个功能1个扩展), 然后将其注册到config.yml文件中, 最后我们将展示一些使用示例。

注意:本教程适用于Symfony 2.x和Symfony3.x。

实现

首先, 请在捆绑包的根文件夹中找到自己, 并创建一个名为Extensions的文件夹(或根目录/ src)(如果不存在)。然后在名为Doctrine的内部创建一个文件夹, 其中将包含该学说的所有扩展类。

而且, 请不要忘记根据项目内部的位置更改每个类的名称空间。

MD5

在先前创建的doctrine文件夹中创建一个名为Md5.php的新类, 并将以下代码保存在其中。

<?php

namespace 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 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

你已经准备好出发了!如果你在产品环境中工作, 请清除缓存, 让我们创建一些查询。

MD5用法

MD5函数可供使用, 你可以在查询生成器或纯DQL中使用它。

给定下表Breeds(具有实体Breeds), 找到MD5哈希为” 1″的品种。

ID 名称 杂凑
1 阿拉斯加雪橇犬 c4ca4238a0b923820dcc509a6f75849b

然后, 我们可以使用查询生成器(记住, MD5哈希为1的是c4ca4238a0b923820dcc509a6f75849b):

<?php

class 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的新类, 并将以下代码保存在其中。

<?php
namespace 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 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

你已经准备好出发了!如果你在产品环境中工作, 请清除缓存, 让我们创建一些查询。

SHA1用法

SHA1函数可供使用, 你可以在查询生成器或普通DQL中使用它。

给定下表Breeds(具有实体Breeds), 找到SHA1哈希为” 1″的品种。

ID 名称 杂凑
1 阿拉斯加雪橇犬 356a192b7913b04c54574d18c28d46e6395428ab

然后我们可以使用查询生成器(请记住, SHA1的1哈希为356a192b7913b04c54574d18c28d46e6395428ab):

<?php

class 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的新类, 并将以下代码保存在其中。

<?php

namespace 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 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

你已经准备好出发了!如果你在产品环境中工作, 请清除缓存, 让我们创建一些查询。

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从”学说扩展名”存储库中获得的

玩得开心 !

赞(0)
未经允许不得转载:srcmini » 如何在Doctrine和Symfony 3中启用加密哈希函数(MD5,SHA1和SHA2)

评论 抢沙发

评论前必须登录!