Tajomstvá mimo stack trace
PHP skryje argument v stack trace len v rámci funkcie, ktorá ho označí #[\SensitiveParameter]. Balík preto označuje každý rámec, ktorým tajomstvo prechádza, nielen vstupný bod — výnimka vyhodená hlboko vo verifieri, kódeku či loaderi tak do vašich logov a hlásení chýb nikdy neprenesie kľúč, token ani tajný kľúč OTP.
Čo je označené
- Kľúče, tajné kľúče, peppery a súkromné PEM, tajné kľúče a kódy OTP a otvorený text odovzdaný do Aes256Gcm.
- Oba vstupy ConstantTime::equals() a Crypto::constantTimeEquals(), tak ako PHP označuje oba vstupy hash_equals() — očakávaná hodnota je samotné tajomstvo, MAC, token či OTP.
- Kompaktný token v Jws::verify(), pretože JWS je zvyčajne bearer token, ktorý sám osebe oprávňuje na prístup.
- Každý podpis, HMAC aj podpis verejným kľúčom, v každom rámci, ktorý ho dostane celý: Hmac::verify(), Hs::verify(), Rs::verify(), Es::verify(), EdDSA::verify(), kontrakt Verifier, KeyVerifier::verify() (Crypto::verifier()), kódek ECDSA (Crypto::ecDer()->fromRaw() / toRaw() / isValid()) a konštruktor FlattenedJws. Rámec overenia JWS drží aj podpisovaný vstup (header.payload) a spolu s podpisom z nich znova poskladáte bearer token.
- Dáta odovzdané do Digest::raw(), hex() a withPepper() — tokeny, heslá, osobné údaje.
- Vstup každého kódeku — Base32, Base64, Base64Url, Hex a metódy Crypto::*Encode() / *Decode() — keďže cez ne prechádzajú tajné kľúče OTP, bajty tokenov aj kľúče. Tajný kľúč OTP skopírovaný s medzerami, ktorý sa nepodarí dekódovať, sa tak nikdy neobjaví v stack trace Totp::verify(), Hotp::at() ani ProvisioningUri::totp().
- Vstup každého loadera verejného materiálu: RsaKey::public(), EcKey::public(), OkpKey::ed25519(), Jwk::fromArray() / fromJson(), Certificate::fromPem() / fromDer() / fromBase64() a Chain::fromPems() / fromX5c() / fromPemBundle() vrátane ich podôb cez Crypto::keys() a Crypto::x509(). Súkromné kľúče prichádzajú v tých istých formátoch, takže kľúč odovzdaný omylom — nesprávny súbor, balík len s kľúčom, súkromný či symetrický JWK — zostane mimo stack trace výnimky, ktorá ho odmietne.
Označené nie sú: správy, ktoré podpisujete, overujete alebo z ktorých počítate MAC (samotný podpisovaný vstup k prístupu neoprávňuje), šifrový text, nonce, pridružené dáta, objekty verejných kľúčov, jednotlivé zložky kľúča (súradnice EC, modul či exponent RSA), vstup COSE_Key / CBOR z autentifikátora (WebAuthn vám súkromný kľúč nikdy neodovzdá) a argumenty s algoritmom, dĺžkou, menovkou (label), diskom, cestou či konfiguračným kľúčom. Označenú množinu stráži architektonický test.
Aj ploché volania fasády
Štandardný rámec Facade::__callStatic() v Laraveli zaznamená každý argument, ktorý posúva ďalej. Fasáda Crypto ho nahrádza traitom RedactsSensitiveArguments z package-toolkit, ktorý v tomto rámci obalí každý argument označený v manažéri do SensitiveParameterValue a ostatné nechá viditeľné. Crypto::constantTimeEquals($known, $user), Crypto::base64Decode($secret), Crypto::provisioningUri($secret, …) aj skratky loaderov Crypto::jwkFromJson() / jwkFromArray(), Crypto::certificate() a Crypto::chainFrom*() tak držia tajomstvo mimo stack trace rovnako ako trieda, vnorený prístup či injektovaný CryptoManager. Volania, ktoré najprv vrátia objekt, napríklad Crypto::totp()->verify($secret, $code), tajomstvo cez fasádu vôbec neposúvajú.
Vlastný Verifier
PHP atribút #[\SensitiveParameter] z rozhrania nededí. Verifier, ktorý implementujete sami, musí svoj parameter $signature označiť sám — tak ako to robí kontrakt aj každý verifier balíka. Pozrite si časť Podpisy a algoritmy.
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.