2010-12-13 25 views
8

mio PHP applicazione utilizza gli URL come questi:Facile crittografia e la decrittografia con PHP

http://domain.com/userid/120 
http://domain.com/userid/121 

I tasti e la fine dell'URL sono fondamentalmente la chiave primaria della tabella di database MySQL.

Non voglio che questo numero crescente sia pubblico e inoltre non voglio che qualcuno sia in grado di eseguire la scansione dei profili utente semplicemente interponendo l'ID.

quindi voglio per crittografare questo ID per la visualizzazione in un senso che posso facilmente decifrare nuovamente. La stringa non dovrebbe durare molto.

Qual è il miglior metodo di crittografia per questo?

+2

Vorrei suggerire di utilizzare il nome utente nell'url, come http://domain.com/user/jsmith. È più web 2.0, tieni la tua chiave primaria segreta e non sovraccarichi il server crittografando/decodificando la chiave primaria – aletzo

+0

Sto davvero cercando di resistere all'impulso di dire * che stai facendo male *. Innanzitutto, a chi importa se i profili utente possono essere sottoposti a scansione? Google li troverà comunque, quindi non esiste un vero modo per impedirgli di metterli dietro un login (e anche allora, qualcuno che vuole le informazioni lo otterrà). In secondo luogo, perché usare l'id nell'URL? Perché non utilizzare il nome utente univoco (il nome utente è unico, non è vero?)? Dà più significato semantico del numero e non dovrebbe essere molto meno efficiente (supponendo che tu abbia impostato "UNICO" nella colonna del nome utente) ... – ircmaxell

risposta

0

di buio l'URL non sarà mai fissarlo. Rende più difficile la lettura, ma non è molto più difficile da manipolare. Potresti usare una rappresentazione numerica esadecimale o qualcosa di simile per oscurarlo. Chi sa leggere esadecimale possibile modificare l'URL in pochi secondi, in ogni caso:

$hexId = dechex($id); // to hex 
$id = hexdec($hexId); // from hex 
6

Un approccio migliore (da un punto di vista usabilità e SEO) sarebbe quella di usare una frase unica piuttosto che un ID oscurata. In questo caso, il nome utente dell'utente sembrerebbe una soluzione ideale e sarebbe anche impercettibile.

Detto questo, se non si desidera utilizzare questo approccio, è sufficiente utilizzare un hash (forse md5) del nome utente dell'utente che si memorizzerà nel database insieme agli altri dettagli. In quanto tale, puoi semplicemente fare una ricerca diretta su quel campo. (Vale a dire: Avere cifrare e decifrare parte dell'URL è probabilmente eccessivo.)

-1

generano una stringa univoca per ogni utente e utilizzarlo negli URL

http://domain.com/user/ofisdoifsdlfkjsdlfkj invece di http://domain.com/userid/121

7

Semplice Oscuramento: Base64 li codifica usando base64_encode.
Ora, il tuo http://domain.com/userid/121 diventa: http://domain.com/userid/MTIx
Vuoi di più, fallo ancora, aggiungi alcune lettere intorno ad esso.

Obbligo duro: Utilizzare qualsiasi metodo di crittografia utilizzando la libreria MCrypt.

+0

come distinguere tra una crittografia semplice e complessa? –

+0

@Sandeepan, Simple potrebbe essere facilmente decodificato e non utilizza una chiave, ma difficile da decifrare. – shamittomar

+0

come distinguere tra facile da decifrare e difficile da decifrare? ;-) –

1

Metodo di crittografia più semplice ma potente: XOR con una chiave segreta. http://en.wikipedia.org/wiki/XOR_cipher Nessuna degradazione delle prestazioni pratico.

rappresentazione Base64 non è una crittografia! È un altro modo per dire lo stesso.

Spero che questo aiuti.

+0

Grazie per il commento base64 che non è una crittografia. Doveva essere detto! –

-1

è possibile utilizzare base64_encode e base64_decode funzione per cifrare e decifrare i tuoi URL

+0

+1 per bilanciare chi ti ha dato il voto negativo. La tua non è una cattiva risposta –

+1

Il downvote non era mio, ma il codice base64_ (en | de) non è (en | de) cryption. Oscurerebbe leggermente il numero di identificazione, ma in modo prevedibile. – Aether

+0

base64 non esegue la crittografia, qualsiasi sviluppatore riconoscerà facilmente e sarà in grado di decrittografare il valore, quindi sarà in grado di eseguire la scansione delle pagine. – JohnSmith

3

Avete una varietà di scelte qui:

  • generare e memorizzare un identificatore nel database. È buono perché puoi quindi avere chiavi leggibili che sono garantite come uniche.È dannoso perché causa una modifica dello schema del database e devi effettivamente eseguire una query su tale tabella ogni volta che desideri generare un collegamento.

  • Eseguire una crittografia basata su chiave effettiva, ad esempio basata su MCrypt di PHP. Hai accesso a potenti algoritmi crittografici, ma gli algoritmi più sicuri tendono a generare stringhe molto più lunghe di quanto ti aspetti. XOR fa quello che vuoi, ma non impedisce l'accesso ai valori sequenziali (e la chiave è abbastanza semplice da determinare, data la conoscenza a priori dei numeri).

  • Eseguire una verifica hash-based: invece di utilizzare 121 come identificatore, utilizzare 121-a34df6 dove a34df6 sono i primi sei caratteri del md5 (o altro HMAC) di 121 e una chiave segreta. Invece di decodificare, estrai lo 121 e ricalcoli i sei caratteri, per vedere se corrispondono a ciò che l'utente ha inviato. Questo non nasconde lo 121 (è ancora lì prima del trattino) ma senza conoscere la chiave segreta, il visitatore non sarà in grado di generare i sei caratteri per visualizzare effettivamente il documento numerato 121.

  • Utilizzare XOR con shuffling: mischiare i bit nell'identificatore a 30 bit, quindi applicare lo XOR. Ciò rende più difficile identificare XOR perché anche il pattern shuffle è nascosto.

  • Usare XOR con i tasti su-richiesta: utilizzare fb37cde4-37b3 come chiave, in cui la prima parte è lo XOR di 121 e md5('37b3'.SECRET) (o di un altro modo di generare una chiave di XOR basato su 37b3 e un segreto).

Non utilizzare Base64, è facile da decodificare: se MTIx è 121, quindi MTIy è 122 ...

In ultima analisi, si dovrà accettare il fatto che la soluzione non sarà sicuro: non solo è possibile per gli utenti estrarre URL validi (tramite la cronologia del browser, il referer HTTP o pubblicarli su Twitter), ma il tuo requisito che l'identificatore rientri in un piccolo numero di caratteri significa che è possibile un attacco di forza bruta (e diventa più facile quando inizi ad avere più documenti).

0

Probabilmente direi che è meglio infatti creare una stringa casuale per ogni utente e memorizzarla nel database piuttosto che ottenerne una usando l'hash. Se si utilizza un hash comune, è ancora molto facile iterare su tutte le pagine ;-)

Vorrei scrivere questo nei commenti, ma non ho il rappresentante per questo (ancora?).

0

Quando l'utente fa clic su un collegamento non è necessario utilizzare la chiave primaria, è possibile utilizzare il tasto p in una sessione e ottenerlo da quella sessione. Si prega di non utilizzare la stringa di query ....

Problemi correlati