2017-07-18 3 views
1

Ich benutze die Key Komponente von defuse/php-encryption, um einen sicheren Schlüssel als Gutschein-Codes zu generieren. Der Schlüssel verfügt über eine Funktion zum Drucken des generierten Schlüssels als ascii-sichere Zeichenfolge. Das einzige Problem in meinem Anwendungsfall ist, dass es ziemlich lang ist.Sicher reduzieren Länge der Entschlüsselung/PHP-Verschlüsselung generierten Schlüssel

Gibt es eine sichere Möglichkeit, die Länge des Schlüssels zu reduzieren, mögliche Kollisionen zu vermeiden und sicherzustellen, dass der Schlüssel immer noch zufällig ist, damit gültige Schlüssel nicht erraten werden können?

Ich bin am Ende mit etwas wie einem 16-Zeichen-Schlüssel zu Ende.

+0

Also ist das eigentliche Problem, wie man eine eindeutige Zeichenfolge erhält, die einen Gutscheincode darstellt, richtig? –

+0

In diesem speziellen Anwendungsfall ja. Aber ich würde gerne wissen, wie man das generische und zum Beispiel eine sichere 20-Car-Saite beim nächsten Mal machen kann. Die Entschlüsselung/Php-Verschlüsselung scheint gut aufgebaut zu sein und etwas, dem man vertrauen kann. Aber es ist ein bisschen traurig, dass man keine Art von Länge des generierten Schlüssels wählen kann. (oder ich habe etwas verpasst) – inquam

+0

Sie haben ihren Code richtig. Was Sie suchen, ist ihr crypto-sicherer Zufallsgenerator 'random_bytes' (ich denke PHP 7 hat diese Funktion im Kern). Sobald Sie zufällige Bytes der gewünschten Länge erhalten haben, fügen Sie sie in Ihre Datenbank ein. Setzen Sie diesen Wert auf "unique". Wenn die Einfügung fehlschlägt (aufgrund von Duplikaten), randomisieren Sie sie erneut und fügen Sie sie erneut ein. Verwenden Sie keine Kryptowerkzeuge für zufällige Zeichen. –

Antwort

0

Gibt es eine sichere Möglichkeit, die Länge des Schlüssels zu reduzieren, mögliche Kollisionen zu vermeiden und sicherzustellen, dass der Schlüssel immer noch zufällig ist, damit gültige Schlüssel nicht erraten werden können?

Theoretisch ja. Since the data is hex-encoded, eine sichere Längenreduktion würde wie folgt aussehen (mit constant-time base64url encoding):

<?php 
use ParagonIE\ConstantTime\Base64UrlSafe; 
use ParagonIE\ConstantTime\Hex; 

/** @var Defuse\Crypto\Key $key */ 

// To save a shorter key: 
$saved = $key->saveToAsciiSafeString(); 
$shortened = Base64UrlSafe::encode(
    Hex::decode($saved) 
); 
var_dump($shortened); 

// To restore the key: 
$lengthened = Hex::encode(
    Base64UrlSafe::decode($shortened) 
); 
$restoredKey = Key::loadFromAsciiSafeString($lengthened); 

Dies ist jedoch ein bisschen ein XY Problem. Bewahren Sie den Schlüssel einfach auf und machen Sie nichts Gefährliches.

Verwandte Themen