mmeyer2k / dcrypt
PHP 加密功能的小型库
Requires
- php: >=7.1.0
- ext-mbstring: *
- ext-openssl: *
This package is auto-updated.
Last update: 2024-08-26 00:01:59 UTC
README
为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) { // ... }
流密码
在继续之前,请确保您了解使用流密码的风险和固有问题。
- 每个密钥只能使用一次
- 无法保证数据完整性
- https://en.wikipedia.org/wiki/Stream_cipher_attacks
- https://jameshfisher.com/2018/01/01/making-a-stream-cipher/
一次性密码
一种新颖的基于计数器的流密码。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。