Signatur
Beschreibung
sodium_hex2bin() ist die libsodium-kompatible Variante der Hex-zu-Binär-Konvertierung und wandelt eine hexadezimal kodierte Zeichenkette (z. B. "48656c6c6f") zurück in die entsprechenden rohen Binärdaten um. Sie ist als kryptografisch sicheres Pendant zu hex2bin() konzipiert, da die Implementierung in libsodium einen zeitkonstanten Vergleich (constant-time) durchführt und damit Timing-Angriffe erschwert.
Besonders praktisch ist der optionale zweite Parameter $ignore: Damit können Trennzeichen wie Doppelpunkte (:), Leerzeichen oder Bindestriche angegeben werden, die in der Eingabe-Zeichenkette vorkommen dürfen und beim Dekodieren einfach übersprungen werden. Dies erlaubt die Verarbeitung von Hex-Darstellungen wie "48:65:6c:6c:6f" ohne manuelle Vorverarbeitung.
Die Funktion eignet sich immer dann, wenn Schlüssel, Nonces, Hashes oder andere kryptografische Rohdaten im Hex-Format vorliegen (z. B. aus Konfigurationsdateien oder Datenbanken) und sicher zurückkonvertiert werden müssen. In Verbindung mit sodium_bin2hex() bildet sie ein symmetrisches Paar für die sichere Serialisierung kryptografischer Werte.
Da sodium_hex2bin() Teil der Sodium-Extension ist, steht sie ab PHP 7.2 nativ zur Verfügung, ohne dass eine externe Bibliothek eingebunden werden muss.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $hex Pflicht | string | Die hexadezimal kodierte Eingabe-Zeichenkette. Darf nur gültige Hex-Zeichen (0–9, a–f, A–F) sowie die in $ignore definierten Trennzeichen enthalten. |
|
| $ignore | string | '' | Eine Zeichenkette, deren einzelne Zeichen beim Dekodieren in $hex ignoriert (übersprungen) werden. Typische Werte sind ":", "-" oder " " für formatierte Hex-Ausgaben. |
Rückgabewert
$hex ungültige Zeichen (die nicht in $ignore stehen), wird eine \SodiumException geworfen.Beispiele
Einfache Hex-zu-Binär-Konvertierung
<?php
$hex = sodium_bin2hex('Geheimschlüssel!');
echo $hex . PHP_EOL; // z. B. 476568656....
$binary = sodium_hex2bin($hex);
echo $binary . PHP_EOL; // Geheimschlüssel!
Hex-Zeichenkette mit Trennzeichen dekodieren
<?php
// Hex-String mit Doppelpunkten als Trennzeichen (z. B. aus einem Zertifikat-Fingerprint)
$formattedHex = '48:65:6c:6c:6f';
$binary = sodium_hex2bin($formattedHex, ':');
echo $binary . PHP_EOL; // Hello
// Längere Variante mit Leerzeichen als Trennzeichen
$spacedHex = '48 65 6c 6c 6f';
$binary2 = sodium_hex2bin($spacedHex, ' ');
echo $binary2 . PHP_EOL; // Hello
Schlüssel aus Konfigurationsdatei laden und verwenden
<?php
// Konfigurierter Schlüssel im Hex-Format (z. B. aus .env oder Datenbank)
$hexKey = getenv('ENCRYPTION_KEY_HEX');
// Annahme: ENCRYPTION_KEY_HEX enthält einen 64 Zeichen langen Hex-String (32 Byte)
try {
$binaryKey = sodium_hex2bin($hexKey);
if (mb_strlen($binaryKey, '8bit') !== SODIUM_CRYPTO_SECRETBOX_KEYBYTES) {
throw new RuntimeException('Ungültige Schlüssellänge.');
}
echo 'Schlüssel erfolgreich geladen. Länge: ' . mb_strlen($binaryKey, '8bit') . ' Byte' . PHP_EOL;
} catch (\SodiumException $e) {
echo 'Fehler beim Dekodieren des Schlüssels: ' . $e->getMessage() . PHP_EOL;
}
// Wichtig · Fallstricke
Sicherheitshinweis: Im Gegensatz zur Standard-PHP-Funktion hex2bin() arbeitet sodium_hex2bin() in konstanter Zeit (constant-time), um Timing-Angriffe zu verhindern. Für kryptografische Zwecke sollte daher stets diese Funktion bevorzugt werden.
Fehlerbehandlung: Bei ungültigen Hex-Zeichen (die nicht in $ignore enthalten sind) wirft die Funktion eine \SodiumException. Die Eingabe sollte daher vor dem Aufruf validiert oder der Aufruf in einem try-catch-Block gekapselt werden.
Groß-/Kleinschreibung: Die Funktion akzeptiert sowohl Großbuchstaben (A–F) als auch Kleinbuchstaben (a–f), verhält sich also case-insensitiv bei der Hex-Dekodierung.