dopecode / dcrypt

此包已被废弃,不再维护。作者建议使用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加密模式。

类名 OpenSSL加密 安全等级 进一步阅读
Aes256GcmAes aes-256-gcm 😃 wiki
Aes256Ctr aes-256-ctr ☺️ wiki
Aes256Cbc aes-256-cbc 😑 wiki
Aes256Ofb aes-256-ofb 😬 wiki
Aes256Cfb aes-256-cfb 😯 wiki
Aes256Ccm aes-256-ccm 😲 wiki
Aes256Ecb aes-256-ecb 😡 wiki

自定义加密套件

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 有用,请考虑捐赠。

LTC LN97LrLCNiv14V6fntp247H2pj9UiFzUQZ
BTC 3N7vhA6ghWb1VrP4nGA6m6mzA9T2ASCVEj
ETH 0xe14a56046f28fCEF56A0EA4a84973bDdFF546923

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