Domanda

Vorrei crittografare stringhe che potrebbero potenzialmente essere solo di circa tre o quattro caratteri, ma corrono a una ventina di caratteri. Una funzione di hashing ( md5 , sha1 , crypt ecc.) non è adatto come vorrei essere in grado di decifrare anche le informazioni. L'estensione mcrypt ha una gamma di possibilità completamente scoraggianti.

Qualcuno ha qualche idea sul modo migliore per crittografare in modo sicuro stringhe brevi e perché ? Qualcuno ha collegamenti a qualsiasi materiale che introduce un programmatore occasionale a scenari pratici di crittografia?

È stato utile?

Soluzione

Consiglio vivamente i suggerimenti di Chris Kite . Senza sapere di più su ciò che stai facendo, perché e le minacce che prevedi di dover proteggere da AES-128 è probabilmente sufficiente. La capacità di utilizzare la crittografia simmetrica è ottima per un'app standalone che sarà sia il decrittore che il crittografo dei dati. Come hanno affermato sia Chris Kite che Arachnid , a causa delle ridotte dimensioni dei dati, si consiglia di riempire i dati e utilizzare un vettore di inizializzazione casuale.

  

Aggiornamento: Per quanto riguarda il motivo per cui .... se i dati sono abbastanza piccoli e si può prevedere il IV, è possibile forzare il testo in chiaro generando il testo cifrato per ogni combinazione di testo semplice con il IV noto e abbinandolo al testo cifrato catturato. In breve, ecco come funzionano le tabelle arcobaleno.

Ora, se hai intenzione di crittografare su un server e decrittografare su un altro, andrei con i suggerimenti di pdavis . Utilizzando un metodo asimmetrico, è possibile separare le chiavi di crittografia dalle chiavi di decrittazione. In questo modo se il server che crittografa i dati è compromesso, l'utente malintenzionato non è ancora in grado di decrittografare i dati.

Se puoi, aiuterebbe la community a saperne di più sul tuo caso d'uso per la crittografia. Come ho accennato in precedenza, avere una corretta comprensione delle minacce plausibili è fondamentale per la valutazione dei controlli di sicurezza.

Altri suggerimenti

Mi piace usare GnuPG per tutto ciò che deve essere crittografato su un server e quindi eventualmente decrittografato sul server o su un altro server (che di solito è il mio caso). Ciò consente un ulteriore livello di sicurezza poiché nel mio scenario il server di crittografia non ha la chiave per decrittografare i dati. Inoltre, consente una decodifica manuale più semplice. Ci sono alcuni buoni wrapper disponibili per varie lingue (un altro vantaggio), uno per PHP è Classe PHP GnuPGP .

mcrypt è collegato nella maggior parte delle build di PHP per impostazione predefinita. Contiene tutti i primitivi di cui probabilmente avrai bisogno. Senza sapere di più su ciò che stai crittografando, qual è il tuo modello di minaccia, ecc., È difficile dare consigli concreti su quale algoritmo, modalità operativa, ecc. Usare.

Una cosa che posso dire con certezza: con brevi stringhe di testo, è più vitale che mai che DEVI usare un vettore di inizializzazione unico e casuale. Altrimenti, è banale per qualcuno montare una varietà di attacchi contro i dati crittografati.

Importa se qualcuno può decifrarlo? Se stai solo cercando di offuscarlo un po ', usa ROT13. È vecchia scuola.

Sono d'accordo con Chris Kite - basta usare AES 128, questo è di gran lunga sufficiente.

Non conosco esattamente il tuo ambiente, ma suppongo che tu stia trasmettendo i dati in qualche modo attraverso Internet.

Non usare la BCE, questo produrrà sempre lo stesso risultato per lo stesso testo normale.

La modalità CBC è la strada da percorrere e non dimenticare un vettore di inizializzazione casuale. Questo vettore deve essere comunicato con il testo cifrato e può essere inviato in chiaro.

Per quanto riguarda i tuoi dati, poiché AES è un codice a blocchi, il risultato è sempre un multiplo della dimensione del blocco. Se non vuoi far sapere all'osservatore se i tuoi dati sono brevi o lunghi, aggiungi un po 'di riempimento per estenderlo fino alla dimensione massima prevista.

Se si desidera crittografare e decrittografare i dati all'interno di un'applicazione, molto probabilmente si desidera utilizzare un codice di chiave simmetrica. AES, che è l'algoritmo di crittografia a blocchi simmetrico certificato dall'NSA per proteggere i dati top secret, è la scelta migliore. È disponibile un'implementazione di PHP puro all'indirizzo www.phpaes.com

Per il tuo uso sembra che AES128 sia sufficiente. Dovrai utilizzare la modalità CBC con un vettore di inizializzazione casuale, altrimenti gli stessi dati produrranno sempre lo stesso testo cifrato.

La scelta del giusto algoritmo di crittografia è un buon primo passo, ma ci sono molti fattori in un sistema sicuro che sono difficili da ottenere come la gestione delle chiavi. Ci sono buone risorse là fuori, come Applied Cryptography di Bruce Schneier e Security Engineering di Ross Anderson (disponibile gratuitamente online).

Credo che qualsiasi algoritmo di crittografia unidirezionale come Blowfish funzionerà. Blowfish è veloce e aperto. Puoi usare Blowfish attraverso la funzione crypt (). AFAIK non ci sono algoritmi di crittografia che funzionano particolarmente bene su stringhe di piccole dimensioni. Una cosa da tenere presente è che forzare brutalmente stringhe così piccole sarà molto semplice. Forse dovresti crittografare la stringa insieme a un valore salt "segreto" per maggiore sicurezza.

Puoi usare le idee di programmazione generali senza affidarti alle funzioni di crittografia / decodifica integrate Esempio di creazione di una funzione chiamala

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

Nella pagina con link per includere l'id richiesto per essere crittografato

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

Sul file di destinazione che viene aperto dopo aver fatto clic sul collegamento

     /**
      *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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top