dopecode / dcrypt
Requires
- php: >=7.1.0
- ext-mbstring: *
- ext-openssl: *
- dev-master
- 14.x-dev
- 14.0.0.x-dev
- 13.2.0
- 13.1.2
- 13.1.1
- 13.1.0
- 13.0.0
- 12.0.2
- 12.0.1
- 12.0.0
- 11.0.0
- 10.0.1
- 10.0.0
- 9.2.0
- 9.1.1
- 9.1.0
- 9.0.0
- 8.3.1
- 8.3.0
- 8.2.1
- 8.2.0
- 8.1.0
- 8.0.1
- 8.0.0
- 7.0.1
- 7.0.0
- 6.0.3
- 6.0.2
- 6.0.1
- 6.0.0
- 5.0.0
- 4.0.2
- 4.0.1
- 4.0.0
- 3.1.0
- 3.0.1
- 3.0.0
- 2.0.1
- 2.0.0
- 1.0.1
- 1.0.0
- 0.1.0
- 0.0.3
- 0.0.2
- 0.0.1
- 0.0.0
- dev-14.0.0-dev
- dev-analysis-J2Pk1k
- dev-php81
This package is auto-updated.
Last update: 2023-08-25 21:41:51 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加密模式。
类名 | OpenSSL加密 | 安全等级 | 进一步阅读 |
---|---|---|---|
Aes256Gcm 或Aes |
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) { // ... }
流加密
在进行之前,务必理解使用流加密的风险和固有问题。
- 每个密钥只能使用一次
- 无法保证数据完整性
- https://zh.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 有用,请考虑捐赠。
LTC |
LN97LrLCNiv14V6fntp247H2pj9UiFzUQZ |
BTC |
3N7vhA6ghWb1VrP4nGA6m6mzA9T2ASCVEj |
ETH |
0xe14a56046f28fCEF56A0EA4a84973bDdFF546923 |
或者,请考虑查看我受 dcrypt 启发的 .NET 加密库,查看 harpocrates。