martin3r / platform-core
Plattform Core Package
Installs: 593
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
pkg:composer/martin3r/platform-core
Requires
- laravel/sanctum: ^4.1
- laravel/socialite: ^5.0
- openai-php/client: ^0.8.0
- socialiteproviders/microsoft: ^5.23
This package is auto-updated.
Last update: 2025-10-31 14:35:01 UTC
README
Diese Bausteine stellen modulübergreifend sichere Feldverschlüsselung und Hashing bereit.
Überblick
- Casts
Platform\Core\Casts\EncryptedString– verschlüsselt/entschlüsselt Strings transparentPlatform\Core\Casts\EncryptedJson– verschlüsselt/entschlüsselt JSON (Array)
- Trait
Platform\Core\Traits\Encryptable– richtet Casts ein und pflegt automatisch<feld>_hashbeim Speichern
- Helper
Platform\Core\Support\FieldHasher– HMAC-SHA256 Hashing (mit optionalem Team-Salt), inkl. Key-Rotation
- Konfiguration
config/security.php– Schlüssel für Verschlüsselung/Hashing und Rotation
Verwendung in Modellen
- Felder definieren (z. B. in einem Modul-Model):
use Platform\Core\Traits\Encryptable; class CustomerSecret extends Model { use Encryptable; protected array $encryptable = [ 'iban' => 'string', 'api_token' => 'string', 'meta' => 'json', ]; }
- Migration im Modul:
Schema::table('customers', function (Blueprint $table) { $table->text('iban')->nullable(); $table->char('iban_hash', 64)->nullable()->index(); $table->text('api_token')->nullable(); $table->char('api_token_hash', 64)->nullable()->index(); $table->longText('meta')->nullable(); });
- Suche über Hash statt Klartext:
use Platform\Core\Support\FieldHasher; $teamSalt = (string) auth()->user()?->currentTeam?->id; $hash = FieldHasher::hmacSha256($ibanImKlartext, $teamSalt); $customer = CustomerSecret::where('iban_hash', $hash)->first();
Schlüsselrotation
.env:HASH_KEY=stable-hash-key(optional; Fallback istAPP_KEY)PREVIOUS_HASH_KEYS=oldHashKey1,oldHashKey2PREVIOUS_ENCRYPTION_KEYS=oldEncKey1,oldEncKey2
- Verhalten:
- Casts versuchen Entschlüsselung mit aktuellem
APP_KEY, dann mitPREVIOUS_ENCRYPTION_KEYS. FieldHasher::matchesAny($value, $teamSalt, config('security.previous_hash_keys'))liefert Hashes für aktuelle und alte Keys (für Migrations-/Vergleichslogik).
- Casts versuchen Entschlüsselung mit aktuellem
Hinweise & Best Practices
- Verschlüsselte Felder als
text/longTextspeichern. - Für Indizes/Suche ausschließlich Hash-Spalten (
*_hash) verwenden; niemals Klartext indizieren. - Team-/Mandantensalt: Wenn möglich
team_idals Salt nutzen, um Hashes teambezogen zu entkoppeln. - Maskierung (UI/Logs): Bei Bedarf zusätzliche Helper ergänzen (z. B. IBAN-Maskierung).