HMAC a hašovanie
Hash\Hmac podpisuje a overuje kľúčované MAC — základ kontroly podpisov webhookov. Tajné kľúče sa odovzdávajú pri každom volaní a sú označené #[\SensitiveParameter]; trieda nedrží žiadny vlastný kľúč:
use RoundlyConsulting\Crypto\Facades\Crypto;
use RoundlyConsulting\Crypto\Hash\HashAlgorithm;
// GitHub-style "sha256=…" header check:
$expected = 'sha256='.Crypto::hmac(HashAlgorithm::Sha256)->signHex($request->getContent(), $webhookSecret);
$ok = Crypto::constantTimeEquals($expected, $request->header('X-Hub-Signature-256', ''));
// Deterministic digest → an indexable lookup column:
$lookupKey = Crypto::digest()->hex($emailLowercased);Alebo volajte priamo triedy, ktoré fasáda sprístupňuje:
use RoundlyConsulting\Crypto\Hash\Hmac;
use RoundlyConsulting\Crypto\Hash\HashAlgorithm;
$hmac = new Hmac(HashAlgorithm::Sha256);
// GitHub-style "sha256=…" header check:
$expected = 'sha256='.$hmac->signHex($request->getContent(), $webhookSecret);
$ok = hash_equals($expected, $request->header('X-Hub-Signature-256', ''));
// Or verify raw signatures directly (constant-time):
$ok = $hmac->verify($payload, $signature, $webhookSecret);| Metóda | Vracia |
|---|---|
sign($message, $key) | HMAC ako surové bajty. |
signHex($message, $key) | HMAC ako hex malými písmenami. |
verify($message, $signature, $key) | bool — overenie podpisu v surových bajtoch v konštantnom čase. |
Deterministické digesty
Hash\Digest pre rovnaký vstup vždy vráti rovnaký výstup — práve to umožňuje indexované vyhľadávanie podľa zhody nad hašovanými dátami, napríklad slepý index nad e-mailom alebo tokenom:
use RoundlyConsulting\Crypto\Hash\Digest;
$digest = new Digest; // SHA-256
$lookupKey = $digest->hex($emailLowercased); // deterministic → indexable column
$peppered = $digest->withPepper($token, config('app.pepper')); // HMAC when a pepper is set
$raw = $digest->raw($data); // raw byteswithPepper() robí voľbu medzi obyčajným a kľúčovaným digestom explicitnou: obyčajný digest zvolí iba null. Akýkoľvek iný pepper — aj medzera či prázdny reťazec — sa použije doslovne ako HMAC kľúč, takže prázdna hodnota nikdy potichu nezníži kľúčovaný digest na obyčajný.
Porovnanie v konštantnom čase
ConstantTime::equals() obaľuje hash_equals, aby každé porovnanie tajného kľúča, tagu či MAC prechádzalo jedným miestom a časovaním neprezradilo, aká časť hodnoty sa zhodovala:
use RoundlyConsulting\Crypto\Hash\ConstantTime;
// $known is the trusted value, $user the attacker-influenced one:
$ok = ConstantTime::equals($knownExpected, $userSupplied);Hašovacie algoritmy
| Prípad | Hodnota | Stav |
|---|---|---|
HashAlgorithm::Sha1 | sha1 | Zastaraný — prelomený kolíziami, len pre kompatibilitu; isLegacy() vracia true. |
HashAlgorithm::Sha256 | sha256 | Aktuálny (predvolený). |
HashAlgorithm::Sha384 | sha384 | Aktuálny. |
HashAlgorithm::Sha512 | sha512 | Aktuálny. |
OTP je oddelené: RFC 6238 predpisuje SHA-1 a autentifikačné aplikácie ho používajú predvolene, preto Otp\OtpAlgorithm ponecháva SHA-1 ako plnohodnotnú voľbu.
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.