spaze/encryption

各种加密助手,使用 Halite(它使用 Sodium)进行加密

v2.0.0 2024-01-19 21:29 UTC

This package is auto-updated.

Last update: 2024-09-19 22:59:36 UTC


README

各种加密助手,使用 paragonie/halite(它使用 Sodium)进行加密。支持密钥轮换。

PHP Tests

Nette 框架中的使用

尽管可以在任何地方使用,但这个库不依赖于 Nette 框架的任何东西。

定义加密密钥

将此(或类似内容)添加到您的 config.local.neon 参数部分(请勿将此提交到仓库)

encryption:
    keys:
        passwordHash:
            prod1: "phek_abadcafec15c..." # prefix _ [0-9A-F]{64}
        email:
            prod1: "eek_cafebabe25da..." # prefix _ [0-9A-F]{64}
    activeKeyIds:
        passwordHash: prod1
        email: prod1
    prefixes:
        passwordHash: phek # password hash encryption key
        email: eek # email encryption key

您必须生成自己的密钥。例如,您可以使用

bin2hex(random_bytes(32))

来生成密钥,然后添加前缀。每个组中可以有多个密钥(这里我们看到两个组:passwordemail),这意味着您将能够解密使用这些密钥加密的数据。数据将始终使用 activeKeyIds 部分中定义的内容进行加密。

此配置是一个示例,您不需要使用组,甚至配置密钥名称(如 activeKeyIds),这些名称的唯一用途是在定义服务或服务时。

服务

然后为每个密钥组定义服务(您可以自由提交此内容)

services:
    emailEncryption: \Spaze\Encryption\SymmetricKeyEncryption(%encryption.keys.passwordHash%, %encryption.activeKeyIds.passwordHash%, %encryption.prefixes.passwordHash%)
    passwordHashEncryption: \Spaze\Encryption\SymmetricKeyEncryption(%encryption.keys.email%, %encryption.activeKeyIds.email%, %encryption.prefixes.email%)

在这个类中使用这些服务,该类需要加密和解密电子邮件地址,无论出于何种原因

use Spaze\Encryption\SymmetricKeyEncryption;

class Something
{

    public function __construct(
        private SymmetricKeyEncryption $emailEncryption,
    ) {
        // ...
    }

    public function doSomething()
    {
        // ...
        $encryptedEmail = $this->emailEncryption->encrypt($email);
        // ...
    }


    public function doSomethingElse()
    {
        // ...
        $decryptedEmail = $this->emailEncryption->decrypt($email);
        // ...
    }

}

传递正确配置的加密服务到该类

services:
    something: Something(emailEncryption: @emailEncryption)

密钥轮换

您始终可以添加新的加密密钥,将其设置为活动密钥,从那一刻起,数据将使用新密钥进行加密。除非您删除旧密钥,否则将能够使用它解密加密的数据。然后,您可以重新加密使用旧密钥加密的所有数据,仅为了更改用于加密它们的密钥。完成后,您可以删除旧密钥。

您可以使用 needsReEncrypt($ciphertext): bool 来查看数据是否使用非活动密钥加密,因此应该使用当前活动密钥进行重新加密。

运行测试

如果您想做出贡献(太棒了,谢谢!),您应该为您的贡献添加/运行测试。首先通过运行 composer install 安装开发依赖项,然后使用 composer test 运行测试,请参阅 composer.json 中的 scripts。测试还将在每次推送时通过 GitHub 的 Actions 运行。

您可以通过运行 composer cs-fix 自动修复编码风格问题。