Šifrované hodnoty
Označte definíciu cez encrypted: true a jej hodnota sa pri uložení transparentne zašifruje cez Crypt a pri čítaní dešifruje. Funguje pre každý typ; hodnoty null cez Crypt nikdy neprechádzajú:
Attributes::define(new AttributeDefinitionData('token', AttributeType::String_, encrypted: true));
Attributes::for($product)->set('token', 'secret');
Attributes::for($product)->get('token'); // 'secret' (DB column holds ciphertext)Rovnaký príznak funguje v definíciách v konfigurácii aj v schémach modelov:
// config/attributes.php — or a model's $attributeDefinitions
'definitions' => [
'api_token' => ['type' => 'string', 'encrypted' => true],
'birth_date' => ['type' => 'datetime', 'encrypted' => true],
],Ako to funguje
- Hodnota sa najprv prevedie na uložený reťazec a až potom zašifruje cez Crypt v Laraveli — typ tak zostane zachovaný.
- Každý riadok nesie príznak is_encrypted a čítanie dešifruje podľa riadku, nie podľa aktuálnej definície. Zapnutie šifrovania neskôr ovplyvní len hodnoty zapísané potom; staršie riadky sa naďalej čítajú správne.
- Hodnoty sa šifrujú kľúčom aplikácie, preto musí byť APP_KEY nastavený všade, kde sa atribúty čítajú alebo zapisujú.
- Jedinečnosť funguje ďalej: šifrovaná jedinečná hodnota sa indexuje kľúčovaným slepým indexom odvodeným z APP_KEY, nikdy otvoreným textom.
- Revízie ukladajú šifrový text, takže auditná stopa nikdy nevyzradí tajomstvá.
- php artisan about vypisuje definície len ako počet, takže názvy šifrovaných atribútov sa v diagnostike neobjavia.
Obmedzenia
Šifrový text je nedeterministický, preto šifrované hodnoty query scopy nedokážu porovnať, ohraničiť ani zoradiť. Scopy na prítomnosť, napríklad whereHasAttribute(), fungujú ďalej a rovnako aj unique:
use RoundlyConsulting\Attributes\DataTransferObjects\AttributeDefinitionData;
use RoundlyConsulting\Attributes\Enums\AttributeType;
use RoundlyConsulting\Attributes\Enums\UniqueScope;
use RoundlyConsulting\Attributes\Facades\Attributes;
Attributes::define(new AttributeDefinitionData(
'national_id',
AttributeType::String_,
unique: UniqueScope::Global_,
encrypted: true,
));
Attributes::for($a)->set('national_id', 'AB123');
Attributes::for($b)->set('national_id', 'AB123'); // throws DuplicateAttributeValueExceptionRotácia APP_KEY zmení kľúč slepého indexu — šifrované jedinečné hodnoty potom uložte znova.
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.