krak/crypto

此包的最新版本(v0.1.3)没有可用的许可证信息。

加密库

v0.1.3 2017-04-20 00:24 UTC

This package is auto-updated.

Last update: 2024-09-18 18:01:20 UTC


README

为php设计的一个优秀的加密库。

安装

composer require krak/crypto

设计

加密库有两个主要接口:CryptPad

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 实现执行加密,而其他只是装饰器。

McryptCryptOpenSSLCrypt 处理加密。每个 crypt 使用 Krak\Crypto\pack_payload 方法将 iv 预先添加到密文。

注意:请了解您传入的密钥。密钥大小取决于算法,通常在 8、16、24 或 32 字节之间。

Base64CryptHmacCrypt 是提供消息 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