Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 条令加密列_Php_Symfony_Encryption_Doctrine Orm - Fatal编程技术网

Php 条令加密列

Php 条令加密列,php,symfony,encryption,doctrine-orm,Php,Symfony,Encryption,Doctrine Orm,使用原则2和Symfony 3,是否有一种简单的方法可以自动加密列 理想情况下,它应该是这样工作的: /** * @ORM\Column(name="secret", type="string") * @Encrypted */ private $secret; 或者,是否有支持加密的官方(或非常流行的)捆绑包?您可以使用此捆绑包 例如: /** * @Encrypt */ protected $secret; 不确定是否有任何真相,我不是密码专家,但作者(Michael de

使用
原则2
Symfony 3
,是否有一种简单的方法可以自动加密列

理想情况下,它应该是这样工作的:

/**
 * @ORM\Column(name="secret", type="string")
 * @Encrypted
 */
private $secret;

或者,是否有支持加密的官方(或非常流行的)捆绑包?

您可以使用此捆绑包

例如:

/**
 * @Encrypt
 */
protected $secret;

不确定是否有任何真相,我不是密码专家,但作者(Michael de Groot)声称“ambta”版本不安全,并提供了他自己的替代品

这是ambta创建的原始bundle的分支,可以在这里找到:ambta/DoctrineEncryptBundle

此捆绑包通过不滚动自己的加密和使用现场验证的标准库更新了安全性

ambta/DoctrineEncryptBundle不安全,它使用旧的加密函数和编程错误,如在ECB模式下提供IV(不起任何作用)

我想我会把它留在这里,以防它是真的,因为我目前正在寻找相同的功能


更新3 (2018-12-16)

在过去的几天里,我们一直在开发自己的加密模块。因此,如果您是带着对Zend Framework 3+条令模块的希望来到这里的

标准的PHP7.2钠库和Paragonie的模块用于处理实际的en-/解密

属性的加密散列在
onFlush
中完成,用于存储(加密和散列),在
postLoad
中完成解密

属性的加密和哈希分别通过
@Encrypted
@Hashed
注释启用

其他:

  • 加密和解密适配器、订阅者和服务(用于非事件使用)都是使用别名提供的,因此您可以覆盖它们以提供自己的服务
  • 只需提供
    @加密的
    @哈希的
    即可使用
  • @Encrypted
    使用
    type
    选项尝试在解密时返回该类型(
    postLoad


注意:更新了上述内容(2018-12-16),删除了我们在工作中创建的链接,数据加密/散列非常重要。在我即将离开公司时,将链接更改为我自己的回购协议,根据协议,我将接管该回购协议,尽管我也用附加服务对其进行了更新。公司一号(见答案历史)被弃用,取而代之的是我的公司。

您无需使用捆绑包或条令的生命周期。 为此,您可以创建自己的条令自定义类型,创建条令事件列表器,并在此类中插入密码器。在自定义类型中,您可以访问此eventlister以获取加密程序,现在您可以加密到数据库中并从数据库中解密

这是一个小的代码库,是完美和简单的

<?php

namespace PaymentBundle\Doctrine\Type;

use Foobar\Encryption\Aes256OpensslCrypter;
use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\Type;
use FooBundle\Doctrine\EventListener\Crypter;

class Encrypted extends Type
{
    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
    {
        return $platform->getClobTypeDeclarationSQL($fieldDeclaration);
    }

    public function getName(): string
    {
        return 'encrypted';
    }

    public function convertToDatabaseValue($value, AbstractPlatform $platform): string
    {
        if ($value === '') {
            return '';
        }

        $crypter = $this->getCrypter($platform);

        return $crypter->encrypt($value);
    }

    public function convertToPHPValue($value, AbstractPlatform $platform): string
    {
        if ($value === '') {
            return '';
        }

        $crypter = $this->getCrypter($platform);

        return $crypter->decrypt($value);
    }

    private function getCrypter(AbstractPlatform $platform): Aes256OpensslCrypter
    {
        /** @var array $listCrypterListener */
        $listCrypterListener = $platform->getEventManager()->getListeners('crypter');
        /** @var Crypter $crypterListener */
        $crypterListener = array_shift($listCrypterListener);

        return $crypterListener->getCrypter();
    }
}

我已经使用过它,它工作得很好,所以如果有其他包对您不好,请尝试ItRemember,这个包,就像它分叉的包一样,仍然使用ext-mcrypt,从PHP7.1开始就不推荐使用ext-mcrypt。一个更好的选择是需要OpenSSL,但到目前为止,Symfony还没有支持OpenSSL的捆绑包。在更新答案之前,请阅读以下内容:虽然链接是分享知识的好方法,但如果将来出现问题,它们不会真的回答问题。在回答中添加回答问题的链接的基本内容。如果内容太复杂或太大而不适合此处,请描述建议解决方案的总体思路。请记住始终保留原始解决方案网站的链接引用。见:
// Foo.orm.yml
Entity\Foo:
  type: entity
  table: foo
  options:
    collate:
      utf8_unicode_ci
  id:
    id:
      id: true
      type: string
      length: 36
  fields:
    details:
      nullable: true
      type: encrypted
  lifecycleCallbacks: {  }

// Symfony services.yml
Foobar\Encryption\Aes256OpensslCrypter: ["%crypter_secret_key%"]
FooBundle\Doctrine\EventListener\Crypter:
  arguments:
    - '@Foobar\Encryption\Aes256OpensslCrypter'
  tags:
    - {name: doctrine.event_listener, event: crypter}