Was ist der beste Weg, eine sehr kurze Zeichenfolge in PHP zu verschlüsseln?

StackOverflow https://stackoverflow.com/questions/102788

  •  01-07-2019
  •  | 
  •  

Frage

Ich möchte Zeichenfolgen verschlüsseln, die möglicherweise nur etwa drei oder vier Zeichen lang sind, aber etwa zwanzig Zeichen lang sind.Eine Hashing-Funktion (md5, sha1, Krypta usw.) ist nicht geeignet, da ich die Informationen auch entschlüsseln möchte.Der mcrypt Die Erweiterung bietet eine überwältigende Vielfalt an Möglichkeiten.

Hat jemand eine Idee, wie man kurze Zeichenfolgen am besten sicher verschlüsseln kann? Warum?Hat jemand Links zu Material, das einen Gelegenheitsprogrammierer in praktische Verschlüsselungsszenarien einführt?

War es hilfreich?

Lösung

Ich empfehle die Vorschläge von Chris Kite . Ohne zu wissen, mehr über das, was du tust, warum, und die Bedrohungen Sie gegen AES-128 zu schützen antizipieren benötigen wahrscheinlich ausreichend. Die Fähigkeit, die symmetrische Verschlüsselung zu verwenden ist für eine Standalone-Anwendung, die sowohl die Entschlüsselungsvorrichtung und Verschlüssler von Daten sein. Da beide Chris Kite und Arachnid , sagte, aufgrund der geringen Größe Ihrer Daten es ratsam, dass Sie Pad die Daten und eine zufällige Initialisierung Vector.

  

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 zwingen Brute von Klartext mit dem bekannten IV und ist es an den aufgenommenen Chiffre-Text entspricht. Kurz gesagt, das ist, wie Rainbow-Tabellen arbeiten.

Nun, wenn Sie auf einem Server und entschlüsseln zu einem anderen zu verschlüsseln gehst würde ich mit den Vorschlägen von gehen pdavis . Durch ein asymmetrisches Verfahren unter Verwendung der Lage sind, Sie die Verschlüsselungsschlüssel von dem Entschlüsselungsschlüssel zu trennen. Auf diese Weise, wenn der Server die Daten verschlüsselt gefährdet ist, dass der Angreifer ist immer noch nicht in der Lage, die Daten zu entschlüsseln.

Wenn Sie in der Lage zu sein, würde es die Gemeinschaft helfen, mehr über Ihren Anwendungsfall für die Verschlüsselung zu kennen. Wie ich bereits erwähnt, ein richtiges Verständnis von plausiblen Bedrohungen mit Schlüssel ist, wenn die Sicherheitskontrollen zu bewerten.

Andere Tipps

Ich mag für alles GnuPG verwenden, die auf einem Server verschlüsselt werden muss, und dann möglicherweise entweder auf dem Server oder auf einem anderen Server (was mein Fall ist in der Regel) entschlüsselte. Dies ermöglicht eine zusätzliche Sicherheitsstufe, da in meinem Szenario ist die Verschlüsselung von Server den Schlüssel nicht, die Daten zu entschlüsseln. 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 Klasse .

mcrypt ist standardmäßig in die meisten PHP-Builds eingebunden.Es enthält alle Grundelemente, die Sie wahrscheinlich benötigen.Ohne mehr darüber zu wissen, was Sie verschlüsseln, welches Bedrohungsmodell Sie verwenden usw., ist es schwierig, konkrete Empfehlungen zum zu verwendenden Algorithmus, zur Funktionsweise usw. zu geben.

Eines kann ich mit Sicherheit sagen:Bei kurzen Textzeichenfolgen ist es wichtiger denn je, dass Sie einen eindeutigen, zufälligen Initialisierungsvektor verwenden MÜSSEN.Andernfalls ist es für jemanden trivial, verschiedene Angriffe gegen die verschlüsselten Daten zu starten.

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

ich mit Chris Kite zustimmen - verwenden nur AES 128, das ist weit ausreichend

.

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

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

CBC-Modus ist der Weg zu gehen und nicht zu vergessen eine zufällige Initialisierungsvektor. Dieser Vektor wird mit dem Chiffretext zu kommunizieren und kann im Klartext gesendet werden.

In Bezug auf Ihre Daten, da AES eine Blockchiffre ist, das Ergebnis ist immer ein Vielfaches der Blockgröße. Wenn Sie nicht der Beobachter lassen wollen wissen, ob Ihre Daten kurz oder lang ist, fügen Sie einige padding es auf die maximal zu erwartende Größe zu erstrecken.

Wenn Sie verschlüsseln mögen und Entschlüsseln von Daten innerhalb einer Anwendung, Sie wahrscheinlich wollen eine symmetrische Schlüssel-Chiffre verwenden. AES, die der symmetrischen Blockverschlüsselungsalgorithmus, der von der NSA zur Sicherung top secret Daten, ist die beste Wahl zertifiziert ist. Es ist eine reine PHP Implementierung finden Sie unter www.phpaes.com

Für Ihre Verwendung klingt es wie AES128 ausreichend ist. Sie wollen CBC-Modus mit einem zufälligen Initialisierungsvektor verwenden, oder auch die gleichen Daten immer den gleichen verschlüsselten Text erzeugen.

den richtigen Verschlüsselungsalgorithmus zu wählen, ist ein guter erster Schritt, aber es gibt viele Faktoren, die zu einem sicheren System, die als Schlüssel-Management-Recht, so schwer zu bekommen. Es gibt gute Ressourcen gibt, wie Applied Cryptography von Bruce Schneier und Security Engineering von Ross Anderson (kostenlos erhältlich online).

Alle Einweg-Verschlüsselungsalgorithmus wie Blowfish tun, denke ich. Blowfish ist schnell und offen. Sie können Blowfish durch die crypt () Funktion verwenden. AFAIK gibt es keinen Verschlüsselungsalgorithmus, der auf kleine Saiten besonders gut funktionieren. Eine Sache zu beachten ist aber, dass Brute-Forcing solche kleinen Saiten sehr einfach sein. Vielleicht sollten Sie die Zeichenfolge zusammen mit einem ‚geheimen‘ Salt-Wert für zusätzliche Sicherheit verschlüsselt werden.

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

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;
}

Auf der Seite mit Link, um die IDs enthalten erforderlich verschlüsselt werden

   /**
    *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>' ;

Auf der Zieldatei, die geöffnet erhalten, nachdem der Link geklickt wird

     /**
      *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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top