piggly / php-encryption

使用 libsodium 扩展生成签名或加密消息的简单类。

1.0.1 2021-02-17 23:37 UTC

This package is auto-updated.

Last update: 2024-09-18 07:29:14 UTC


README

Latest Version on Packagist Software License

该库是为了简化数据加密过程而创建的。其目的是提供简单的接口,以满足不同类型加密的需求。

任何加密类都必须扩展 BaseCrypto 类,并包含一个返回 array 类型键的 createKeys() 方法,以辅助创建安全的加密方法密钥。

目前有两个方法可用

  • BasicCrypto 使用内置函数 openssl_encryptopenssl_decrypt 以简单方式加密数据。 需要 PHP 的 openssl 扩展
  • SolidumCrypto 使用最新的 LibSodium 加密和签名数据。 需要 PHP 的 sodium 扩展(更多信息请见安装部分)。

如果您喜欢这个库的功能并想支持这项工作,请随意通过以下随机像素值进行捐赠 aae2196f-5f93-46e4-89e6-73bf4138427b ❤。

安装

您可以通过 Composer 使用以下命令安装此库: composer require piggly/php-encryption。建议安装后运行 composer check-platform-reqs 命令,以检查您是否拥有使用一个或多个加密方法所需的扩展。

Libsodium

根据您的操作系统进行安装。对于 Linux、Mac 和 Windows,安装步骤不同。

Libsodium 库不是 PHP 的原生库。必须手动安装以确保 SolidumCryto 类能够正确运行。因此,在您的服务器上,执行以下命令 sudo apt-get install libsodium-dev

然后,使用以下命令安装 PHP 的 PECL 扩展管理器 PECL(请参阅此处了解详细信息): sudo apt-get install php-pear。最后,使用以下命令为 PHP 安装 libsodium 扩展并激活它: sudo pecl install -f libsodium 并在 php.iniclifpm 版本中激活它。

了解更多关于 Libsodium 的信息请在此处

如何使用?

使用 OpenSSL 进行基本加密

使用 BasicCrypto 类创建基本的加密操作。为了开始,请始终生成一个安全的密钥并将其保存在 .env 或类似的环境中。请始终将密钥记录在受第三方保护读取的文件中。

生成随机密钥的简单方法是通过使用 BasicCrypto::createKeys() 函数。该函数将返回包含 secret_keyarray。然后,使用 BasicCrypto::setKeys() 方法用 secret_key 初始化类,并使用 BasicCrypto::encrypt()BasicCrypto::decrypt() 方法进行加密。请参阅

// Chaves
$keys = BasicCrypto::createKeys();
// <- salve $keys['secret_key'] em um arquivo e leia-o posteriormente em uma constante, ambiente ou afins...

// Inicialize as chaves
BasicCrypto::setKeys( SECRET_KEY );

// ...
// Mais tarde no código
// ...
$encrypted = BasicCrypto::encrypt('this is my secret message');
$decrypted = BasicCrypto::decrypt($encrypted);

if ( $descrypted !== false )
{ /** O conteúdo foi descriptografado */ }

使用 Sodium 进行加密

Sodium 是一个为安全操作设计的现代库。它是多平台和多语言的。其目标是提供构建高级加密工具所需的主要操作。

除了构建安全的加密之外,最大的优点之一是库的可移植性。这意味着您可以使用 PHP 加密消息,如果需要的话,也可以用 NodeJs、Python 等语言进行解密。

使用SodiumCrypto类来创建基本的加密和签名操作。开始时,始终生成安全的密钥序列并将其保存到具有.env或类似功能的环境中。始终将密钥写入一个防止第三方读取的文件。

注意!Sodium一起工作的密钥需要由库中的算法生成。因此,始终使用SodiumCrypto::createKeys()方法。该方法将返回一个包含以下密钥的数组

生成并保存密钥后,使用SodiumCrypto::setKeys()方法初始化类,定义所有所需的密钥。最后,使用SodiumCrypto::encrypt()SodiumCrypto::descrypt()方法进行加密和解密,以及使用SodiumCrypto::sign()SodiumCrypto::checkSignature()方法进行签名和验证签名。请参阅以下内容。

// Chaves
$keys = SodiumCrypto::createKeys();
// <- salve todas as chaves em um arquivo e leia-o posteriormente em uma constante, ambiente ou afins...

// Inicialize as chaves
SodiumCrypto::setKeys( 
	PUBLIC_KEY,
	PRIVATE_KEY,
	SIGNATURE_PUBLIC_KEY,
	SIGNATURE_PRIVATE_KEY 
);

// ...
// Mais tarde no código
// ...
$encrypted = SodiumCrypto::encrypt('this is my secret message');
$decrypted = SodiumCrypto::decrypt($encrypted);

if ( $descrypted !== false )
{ /** O conteúdo foi descriptografado */ }

// Para criação de assinaturas
$signedMessage  = SodiumCrypto::sign('i am signed');
$validSignature = SodiumCrypto::checkSignature($signedMessage);

if ( $validSignature !== false )
{ /** O conteúdo é autentico */ }

加密 ≠ 签名

使用SodiumCrypto::sign()方法时,消息不会被加密。在这种情况下,消息将仅被签名以确保其在往返过程中不被修改。但是,仍然可以对其进行加密。

$signedMessage  = SodiumCrypto::sign('i am signed');
$encrypted = SodiumCrypto::encrypt($signedMessage);
$decrypted = SodiumCrypto::decrypt($encrypted);
$validSignature = SodiumCrypto::checkSignature($decrypted);

if ( $validSignature !== false )
{ /** O conteúdo é autentico */ }

变更日志

有关代码中所有变更的信息,请参阅CHANGELOG文件。

代码测试

这个库使用PHPUnit。我们对这个应用程序的所有主要类进行了测试。

vendor/bin/phpunit

贡献

在提交贡献之前,请参阅CONTRIBUTING文件以获取信息。

安全性

如果您发现任何与安全相关的问题,请通过dev@piggly.com.br发送电子邮件,而不是使用GitHub的issue追踪器。

致谢

支持项目

Piggly Studio是一家位于巴西里约热内卢的本地代理商。如果您喜欢这个库的功能并希望支持这项工作,请随时通过随机密钥Pix aae2196f-5f93-46e4-89e6-73bf4138427b进行捐赠 ❤。

许可证

MIT许可证(MIT)。有关更多信息,请参阅LICENSE