mmeyer2k/dcrypt

PHP 加密功能的小型库

13.2.0 2022-04-14 04:51 UTC

README

Build Status Code Coverage Scrutinizer Code Quality Code Climate GPA License Latest Stable Version

为PHP 7.1+提供必要加密功能的小型库。对于旧版PHP版本的支持,请查看这里

安装

将dcrypt添加到composer.json文件的要求中。不用担心,dcrypt没有自己的依赖。

composer require "mmeyer2k/dcrypt:^13.2"

分组密码

dcrypt库帮助应用程序开发者避免在加密实现中常见的错误,这些错误会使数据处于风险之中。

规范文档

密钥

安全地使用dcrypt的分组密码函数需要使用高熵256位(最小)密钥。密钥应以base64编码格式传递给dcrypt。您对密钥的随机性负责!

在Linux CLI上生成新密钥

head -c 32 /dev/urandom | base64 -w 0 | xargs echo

或者用PHP...

<?php
$key = \Dcrypt\OpensslKey::create(32);

AES-256 GCM 加密

由于PHP 7.1支持本机AEAD加密模式,因此对于大多数应用程序,使用GCM将是最佳选项。Dcrypt将处理AEAD认证标签,SHA3-256 HMAC,初始化向量以及加密消息作为一个未编码的单个字符串。

<?php
$key = '[...BASE64 KEY...]';

$encrypted = \Dcrypt\Aes::encrypt('a secret', $key);

$plaintext = \Dcrypt\Aes::decrypt($encrypted, $key);

如果有疑问,请使用此示例,不要再继续阅读!

其他AES-256模式

如果您已经阅读到这里,那么您是一位经验丰富的密码学家,恭喜!👌 🤘

通过硬编码的类,默认支持几种AES-256加密模式。

自定义加密套件

Dcrypt与PHP支持的大多数 OpenSSL密码和哈希算法兼容。运行openssl_get_cipher_methods()hash_algos()以查看您平台上的支持选项。

静态包装器

通过调用OpensslStatic类使用任何密码/算法组合。

<?php
$encrypted = \Dcrypt\OpensslStatic::encrypt('a secret', $key, 'bf-ofb', 'crc32');

$plaintext = \Dcrypt\OpensslStatic::decrypt($encrypted, $key, 'bf-ofb', 'crc32');

类重载

通过重载OpensslBridge类,可以轻松扩展dcrypt的内部函数。

<?php
class BlowfishCrc32 extends \Dcrypt\OpensslBridge 
{
    const CIPHER = 'bf-ofb';

    const ALGO = 'crc32';
}

$encrypted = BlowfishCrc32::encrypt('a secret', $key);

$plaintext = BlowfishCrc32::decrypt($encrypted, $key);

分层加密工厂

如果您特别小心,不确定哪些密码方法和算法可以信任,为什么不尝试所有这些方法呢。

<?php
$stack = (new \Dcrypt\OpensslStack($key))
    ->add('aes-256-ecb', 'snefru')
    ->add('aes-256-ofb', 'sha224')
    ->add('aes-256-cbc', 'sha256')
    ->add('aes-256-ctr', 'sha384')
    ->add('aes-256-gcm', 'sha512');

$encrypted = $stack->encrypt('a secret');

$plaintext = $stack->decrypt($encrypted);

消息真实性检查

默认情况下,当提供的校验和无效时,在允许解密继续进行之前,将抛出\Dcrypt\Exceptions\InvalidChecksumException异常。

<?php
try {
    $decrypted = \Dcrypt\Aes::decrypt('malformed cyphertext', $key);
} catch (\Dcrypt\Exceptions\InvalidChecksumException $ex) {
    // ...
}

流密码

在继续之前,请确保您了解使用流密码的风险和固有问题。

一次性密码

一种新颖的基于计数器的流密码。OneTimePad使用SHA3-512输出一个与输入512位块⊕的密钥流。

规范文档

<?php
$encrypted = \Dcrypt\OneTimePad::crypt('a secret', $key);

$plaintext = \Dcrypt\OneTimePad::crypt($encrypted, $key);

OneTimePad可以使用任何哈希算法生成伪随机密钥流。

<?php
$encrypted = \Dcrypt\OneTimePad::crypt('a secret', $key, 'whirlpool');

$plaintext = \Dcrypt\OneTimePad::crypt($encrypted, $key, 'whirlpool');

字符串辅助工具

生成指定字符数的随机base62字符串令牌。

$token = \Dcrypt\Str::token(10);

以时间安全的方式比较两个字符串。

$equal = \Dcrypt\Str::equal($known, $given);

给我一些爱吧 😍🍺

多年来开发dcrypt是一段美好的旅程。如果您发现dcrypt很有用,请考虑捐赠。

或者请考虑查看我的受dcrypt启发的.NET加密库,请查看harpocrates