spryker/propel-encryption-behavior

用于数据列无缝加密/解密的 Propel 行为

安装次数: 50,014

依赖关系: 2

建议者: 0

安全性: 0

星星: 0

关注者: 49

分支: 0

开放问题: 0

类型:propel-behavior

0.1.1 2022-01-27 16:50 UTC

This package is auto-updated.

Last update: 2024-09-21 14:08:18 UTC


README

Build Status codecov Latest Stable Version Minimum PHP Version PHPStan License

无缝加密/解密 Propel2 数据字段。此库是 Propel2 ORM 框架 的插件。该库是基于 Athens\Encryption 的分支。

例如

// schema.xml

    <table name="my_class">
        <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>

        <column name="my_data" type="varchar" size="255"/>
        <column name="my_secret_data" type="BLOB"/>
        <column name="my_searchable_data" type="varbinary" size="255"/>

        <behavior name="encryption">
            <parameter name="column_name_1" value="my_secret_data"/>
            <parameter name="searchable_column_name_1" value="my_searchable_data"/>
            <parameter name="searchable" value="false"/>
        </behavior>
    </table>
// Before any database queries:

    use Spryker\PropelEncryptionBehavior\Cipher;
    Cipher::createInstance("mysecretpassphrase");


// In your application:

    $o = new MyClass();

    $o->setMyData("Some data that will remain as plain text.");
    $o->setMySecretData("Some data that will be encrypted.");

    $o->save();

// Later:

    $o = MyClassQuery::create()->findOneByMyData("Some data that will remain as plain text.");

    echo $o->getMySecretData();
    // "Some data that will be encrypted."

    // If you need to use different passphrases in different queries:

    use Spryker\PropelEncryptionBehavior\Cipher;

    Cipher::resetInstance();
    Cipher::createInstance("mysecretpassphrase_2");

    // ... read or write data with another passphrase

给定上述表定义,字符串 "Some data that will be encrypted." 在发送到数据库之前在内存中被加密。当我们稍后检索 MySecretData 时,密文在返回之前被解密。

注意/权衡

spryker/propel-encryption-behavior 破坏了 Propel 在加密字段上的原生搜索/查找/排序方法。因为加密字段的明文对数据库不可用,所以无法在这些字段上执行数据库的搜索或排序方法。搜索或排序只能通过 检索所有行、解密所有值,并在这些值上执行搜索/排序来完成。如果您有大量行并且需要在加密字段上搜索/排序,这个过程可能非常缓慢。

安装

composer require spryker/propel-encryption-behavior

使用

此客户端库提供了一个 Cipher 类和一个 Propel2 行为类。

要在您的 Propel 架构中将字段指定为加密,请将其类型设置为 VARBINARYLONGVARBINARYBLOB 并包含 encryption 行为。定义加密列的参数应包含 column_name_* 前缀在名称属性中。您可以在 encryption 行为中包含多个列

    <table name="my_class">
        <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>

        <column name="my_data" type="varchar" size="255"/>

        <column name="my_secret_data" type="varbinary" size="255"/>
        <column name="my_secret_data2" type="varbinary" size="255"/>

        <behavior name="encryption">
            <parameter name="column_name_1" value="my_secret_data"/>
            <parameter name="column_name_2" value="my_secret_data2"/>
        </behavior>
    </table>

然后像平常一样构建您的模型和数据库。

在查询数据库之前,您必须使用您的密码初始化 Cipher 类

    // Intialize the cipher
    Cipher::createInstance($my_passphrase);

参数 $my_passphrase 应该是一个随机字符的字符串。32-64 个字符的长度对密码来说是合适的。因为加密器是在每次页面加载时初始化的,所以密码必须存储在您的服务器上,并可供 PHP 访问。然而,密码不应该在可被网站访问者查看的文件中,并且几乎肯定不应该包含在您的源/版本控制(git、scm 等)中。

就这样!现在,MySecretDataMySecretData2 的类设置器在将其发送到数据库之前无缝加密其数据。现在,MySecretDataMySecretData2 的类获取器在从数据库检索数据后无缝解密数据。

请记住,由于上述原因,现在搜索/查找和排序对 MySecretDataMySecretData2 来说是 损坏的

过滤

默认情况下,所有加密列都不可搜索。您可以设置参数 searchabletrue 来使表中所有加密列可搜索

    <table name="my_class">
        <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
        <column name="my_data" type="varchar" size="255"/>
        <column name="my_secret_data" type="varbinary" size="255"/>

        <behavior name="encryption">
            <parameter name="column_name_1" value="my_secret_data"/>
            <parameter name="searchable" value="true"/>
        </behavior>
    </table>

您还可以使用 searchable_column_name_* 前缀使特定列可搜索

    <table name="my_class">
        <column name="id" type="INTEGER" required="true" primaryKey="true" autoIncrement="true"/>
        <column name="my_data" type="VARCHAR" size="255"/>
        <column name="my_secret_data" type="BLOB"/>
        <column name="my_secret_searchable_data" type="VARBINARY" size="255"/>

        <behavior name="encryption">
            <parameter name="column_name_1" value="my_secret_data"/>
            <parameter name="searchable_column_name_1" value="my_secret_searchable_data"/>
        </behavior>
    </table>

注意:可搜索的列将使用固定的 IV。这会丢失数据安全性。