krak / crypto
加密库
Requires
- nikic/iter: ^1.3
- paragonie/random_compat: ^2.0
Requires (Dev)
- peridot-php/peridot: ^1.18
- symfony/process: ^3.2
Suggests
- symfony/process: For the GnuPGCliCrypt
This package is auto-updated.
Last update: 2024-09-18 18:01:20 UTC
README
为php设计的一个优秀的加密库。
安装
composer require krak/crypto
设计
加密库有两个主要接口:Crypt
和 Pad
。
Crypt 用于加密和解密。
Pad 用于填充和剥离。
用法
<?php use Krak\Crypto; $key = random_bytes(16); $hmac_key = random_bytes(16); $crypt = new Crypto\OpenSSLCrypt($key); $crypt = new Crypto\Base64Crypt(new Crypto\HmacCrypt($crypt, $hmac_key)); $encrypted = $crypt->encrypt('data'); echo $crypt->decrypt($encrypted); // outputs: data
所有 Crypts 实现了接口 Krak\Crypto\Crypt
您还可以使用任何 Krak\Crypto\Pad
类
<?php use Krak\Crypto; $pad = new Crypto\Pkcs7Pad(); $padded = $pad->pad('abc'); echo $pad->strip($padded); // outputs: abc
Crypt
Crypt 库负责加密数据。有一些 crypt 实现执行加密,而其他只是装饰器。
McryptCrypt 和 OpenSSLCrypt 处理加密。每个 crypt 使用 Krak\Crypto\pack_payload
方法将 iv 预先添加到密文。
注意:请了解您传入的密钥。密钥大小取决于算法,通常在 8、16、24 或 32 字节之间。
Base64Crypt、HmacCrypt 是提供消息 base64 编码和 hmac 签名/身份验证的装饰器。
GnuPGCliCrypt 通过 gpg
命令行工具处理加密。
<?php $crypt = new Krak\Crypt\GnuPGCliCrypt('User Name', $passphrase = 'secret', $gpg_executable_path = 'gpg');
它将使用给定的 $username
的公钥和私钥加密/解密数据。重要:您需要确保密钥已正确导入到您的 gpg 命令行工具中。我们使用 --always-trust
标志进行加密,因此请确保您添加的密钥是可信的。
此 crypt 还需要安装 symfony/process
组件。
NullCrypt 更多用于测试或模拟。它只是返回传递给它的数据。
填充类型
- Krak\Crypto\Pkcs7Pad - 通过 pkcs7 算法填充
- Krak\Crypto\NullBytePad - 通过添加空字节进行填充
- Krak\Crypto\NoPad - 不应用任何填充,直接返回字符串。
Iv 生成
crypts 接受一个 iv 生成参数。有三种类型
- Krak\Crypto\mcrypt_iv_gen() - 创建一个 mcrypt iv 生成器,它使用
mcrypt_create_iv
- Krak\Crypto\php_iv_gen() - 创建一个 iv 生成器,它使用
random_bytes
。我们使用paragonie/random_compat
库来处理非 php7 用户 - Krak\Crypto\static_iv_gen($iv) - 创建一个 iv 生成器,它接受一个 iv 并始终返回该 iv 以进行生成。
流
加密库还创建了一个称为流的概念。加密流与 nodejs 流非常相似,它们是缓冲区/内容的流。由于它们有效地沿管道传输信息,因此流对于加密大量数据非常有用。以下是一个使用流将内容转换为大写、加密然后编码的示例。
<?php use Krak\Crypto; $stream = Crypto\str_stream('this is some data'); // create a stream from raw string. $stream = new Crypto\StreamPipe($stream); $crypt_stream = new Crypto\Stream\CryptStream(new Crypto\OpenSSLCrypt($key), 16); // encrypt/decrypt 16 byte chunks at a time $base64_stream = new Crypto\Stream\Base64Stream(64); // encode/decode 64 byte chunks at a time $key = random_bytes(16); $dst = fopen('php://stdout', 'w'); $stream->pipe(Crypto\map_stream('strtoupper')) ->pipe($crypt_stream->encrypt()) ->pipe($base64_stream->encode()) ->pipe(Crypt\write_stream($dst)); // at this point, stdout will have encrypted uppercased info.
查看 API 了解所有不同的流及其用法。
API
运行 make api
创建 API 文档。然后打开 docs/api/index.html
查看 API 文档。
测试
通过 peridot 运行测试
make test