2008-09-19 4 views
12

Ich möchte Zeichenfolgen verschlüsseln, die möglicherweise nur etwa drei oder vier Zeichen lang sind, aber etwa zwanzig Zeichen lang sind. Eine Hash-Funktion (md5, sha1, crypt usw.) ist nicht geeignet, da ich die Informationen auch entschlüsseln möchte. Die mcrypt Erweiterung hat eine erschreckende Reihe von Möglichkeiten.Was ist der beste Weg, eine sehr kurze Zeichenfolge in PHP zu verschlüsseln?

Hat jemand irgendwelche Ideen über den besten Weg, um kurze Zeichenfolgen sicher zu verschlüsseln und warum? Hat jemand irgendwelche Links zu irgendwelchen Materialien, die einen gelegentlichen Programmierer in praktische Verschlüsselungsszenarien einführen?

+1

geklickt wird geöffnet erhalten 3-20 Zeichen, das ist kein Passwort, oder? One-Way-Verschlüsselung ist fast immer eine bessere Wahl für Kennwörter. –

Antwort

4

Ich empfehle die Vorschläge von Chris Kite. Ohne zu wissen, was Sie tun, warum, und die Bedrohungen, die Sie voraussichtlich vor AES-128 schützen müssen, sind wahrscheinlich ausreichend. Die Möglichkeit, symmetrische Verschlüsselung zu verwenden, eignet sich hervorragend für eine eigenständige App, bei der sowohl Daten entschlüsselt als auch verschlüsselt werden. Als sowohl Chris Kite und Arachnid sagte, aufgrund der geringen Größe Ihrer Daten ist es ratsam, dass Sie die Daten auffüllen und einen zufälligen Initialisierungsvektor verwenden.

Update: Was, warum .... wenn die Daten klein genug ist, und die IV vorhergesagt werden kann, ist es möglich, den Klartext durch das Erzeugen Chiffre-Textes für jede Kombination von einfachen zwingen Brute -Text mit der bekannten IV und passe sie an den eingefangenen Chiffretext an. Kurz gesagt, so funktionieren Rainbow-Tabellen.

Nun, wenn Sie auf einem Server zu verschlüsseln gehen und entschlüsseln, auf einem anderen würde ich mit den Vorschlägen von pdavis gehen. Mithilfe einer asymmetrischen Methode können Sie die Verschlüsselungsschlüssel von den Entschlüsselungsschlüsseln trennen. Auf diese Weise kann der Angreifer die Daten nicht entschlüsseln, wenn der Server, der Daten verschlüsselt, kompromittiert ist.

Wenn Sie können, würde es der Community helfen, mehr über Ihren Anwendungsfall für die Verschlüsselung zu erfahren. Wie ich bereits erwähnt habe, ist das richtige Verständnis plausibler Bedrohungen entscheidend für die Bewertung von Sicherheitskontrollen.

3

Spielt es eine Rolle, ob jemand es entschlüsseln kann? Wenn Sie nur versuchen, es ein wenig zu verschleiern, verwenden Sie ROT13. Es ist alte Schule.

+6

Hast du ehrlich gesagt ROT13 in einem Krypto Post vorgeschlagen? –

+5

Heiliger Mist, Alter. Kannst Du lesen? "Ist es wichtig, dass irgendjemand es entschlüsseln kann?" ROT13 ist eine gültige Verschlüsselung. Es ist trivial zu brechen, aber das ist nicht immer wichtig. Ich war klar genug darüber, oder? – Will

0

Jeder einseitige Verschlüsselungsalgorithmus wie Blowfish wird, denke ich. Blowfish ist schnell und offen. Sie können Blowfish über die Funktion crypt() verwenden. AFAIK gibt es keinen Verschlüsselungsalgorithmus, der besonders gut auf kleinen Strings funktioniert. Eine Sache, auf die man sich jedoch bewusst sein muss, ist, dass das Brute-Forcing solcher kleinen Saiten sehr einfach sein wird. Vielleicht sollten Sie die Zeichenfolge zusammen mit einem "geheimen" Salt-Wert für zusätzliche Sicherheit verschlüsseln.

+0

Korrektur: Die crypt() - Version ist nicht geeignet, da sie nicht entschlüsselt werden kann. Verwenden Sie etwas wie http://pear.php.net/package/Crypt_Blowfish. Dadurch haben Sie den zusätzlichen Vorteil, dass Sie sich keine Gedanken über die Installation einer zusätzlichen Erweiterung machen müssen. – Roel

6

Ich benutze gerne GnuPG für alles, was auf einem Server verschlüsselt werden muss und dann möglicherweise entschlüsselt entweder auf dem Server oder auf einem anderen Server (was normalerweise mein Fall ist). Dies ermöglicht eine zusätzliche Sicherheitsstufe, da der Verschlüsselungsserver in meinem Szenario nicht über den Schlüssel zum Entschlüsseln der Daten verfügt. Es ermöglicht auch eine einfachere manuelle Entschlüsselung. Es gibt ein paar gute Wrapper für verschiedene Sprachen (ein weiterer Vorteil), eine für PHP ist GnuPGP PHP Class.

2

Wenn Sie Daten innerhalb einer Anwendung verschlüsseln und entschlüsseln möchten, möchten Sie höchstwahrscheinlich eine symmetrische Schlüsselchiffre verwenden. AES, der symmetrische Blockverschlüsselungsalgorithmus, der von der NSA für die Sicherung streng geheimer Daten zertifiziert wurde, ist die beste Wahl. Es gibt eine pure-PHP-Implementierung unter www.phpaes.com

Für Ihren Gebrauch klingt es wie AES128 ist ausreichend. Sie möchten den CBC-Modus mit einem zufälligen Initialisierungsvektor verwenden, da sonst immer dieselben Daten den gleichen Chiffretext erzeugen.

Die Wahl des richtigen Verschlüsselungsalgorithmus ist ein guter erster Schritt, aber es gibt viele Faktoren für ein sicheres System, die schwer zu beheben sind, wie zum Beispiel das Schlüsselmanagement. Es gibt gute Ressourcen wie Applied Cryptography von Bruce Schneier und Security Engineering von Ross Anderson (kostenlos online verfügbar).

6

mcrypt ist standardmäßig in die meisten PHP-Builds eingebunden. Es enthält alle Primitiven, die Sie wahrscheinlich benötigen. Ohne mehr darüber zu wissen, was Sie verschlüsseln, was Ihr Bedrohungsmodell ist usw., ist es schwierig, konkrete Empfehlungen dazu zu geben, welcher Algorithmus, welcher Betriebsmodus usw. verwendet werden soll.

Eines kann ich sicher sagen: Bei kurzen Textstrings ist es wichtiger denn je, dass Sie einen eindeutigen, zufälligen Initialisierungsvektor verwenden MÜSSEN. Ansonsten ist es für jemanden einfach, eine Vielzahl von Angriffen gegen die verschlüsselten Daten durchzuführen.

1

Ich stimme Chris Kite - nur AES 128 verwenden, das ist weit genug.

Ich weiß nicht genau Ihre Umgebung, aber ich denke, Sie übertragen die Daten irgendwie über das Internet.

Verwenden Sie nicht EZB, dies wird immer das gleiche Ergebnis für den gleichen Klartext produzieren.

CBC-Modus ist der Weg zu gehen und einen zufälligen Initialisierungsvektor nicht vergessen. Dieser Vektor muss mit dem Chiffretext kommuniziert werden und kann im Klartext gesendet werden.

In Bezug auf Ihre Daten, da AES eine Blockchiffre ist, ist das Ergebnis immer ein Vielfaches der Blockgröße. Wenn Sie nicht möchten, dass der Beobachter weiß, ob Ihre Daten kurz oder lang sind, fügen Sie eine Auffüllung hinzu, um ihn auf die maximal erwartete Größe zu erweitern.

0

können Sie die allgemeinen Programmideen verwenden, ohne Verschlüsselung/decription Funktionen eingebaut zu verlassen Beispiel erstellen Sie eine Funktion nennen

function encryptstring($string) { 

$string_length=strlen($string); 
$encrychars=""; 
/** 
*For each character of the given string generate the code 
*/ 
for ($position = 0;$position<$string_length;$position++){   
    $key = (($string_length+$position)+1); 
    $key = (255+$key) % 255; 
    $get_char_to_be_encrypted = SUBSTR($string, $position, 1); 
    $ascii_char = ORD($get_char_to_be_encrypted); 
    $xored_char = $ascii_char^$key; //xor operation 
    $encrypted_char = CHR($xored_char); 
    $encrychars .= $encrypted_char; 
} 
/** 
*Return the encrypted/decrypted string 
*/ 
return $encrychars; 
} 

Sie auf der Seite mit Link, um die IDs erforderlich sind, um

/** 
    *While passing the unique value to a link 
    *Do the following steps 
    */ 

    $id=57;//or if you are fetching it automatically just pass it here 
    /** 
    *For more security multiply some value 
    *You can set the multiplication value in config file 
    */ 
    $passstring=$id*346244; 
    $encrypted_string=encryptstring($passstring); 
    $param=urlencode($encrypted_string); 
    /** 
    *Derive the url for the link 
    */ 
    echo '<a href="target_file.php?aZ98#9A_KL='.$param.'">something</a>' ; 
verschlüsselt werden

Auf der Zieldatei, die nach dem Link

 /** 
     *Retriving the value in the target file 
     *Do the following steps 
     */ 
     $fetchid=$_GET['aZ98#9A_KL']; 
     $passstring=urldecode(stripslashes($fetchid)); 
     $decrypted_string= encryptstring($passstring); 
     /** 
     *Divide the decrypted value with the same value we used for the multiplication 
     */ 
     $actual_id= $decrypted_string/346244; 
Verwandte Themen