2013-03-04 6 views
51

Sto usando il codice $enrypt=md5($pass) e inserendo $encrypt nel database. Voglio scoprire un modo per decrittografarli. Ho provato a utilizzare un software di decrittografia ma dice che l'hash dovrebbe essere di esattamente 16 byte. c'è un modo per decodificarlo o per renderlo un hash md5 da 16 byte?criptare e decodificare md5

mio hash si presenta così: c4ca4238a0b923820dcc

+11

Non decifrare MD5 ... – sachleen

+6

hashing è un'operazione a senso unico, che significa che non può essere decifrato. Tuttavia, è possibile forzare la hash per forzare l'hash per trovare l'input (i) che lavora per esso. – Vulcan

+2

md5 è un meccanismo di hashing della password vecchio e facilmente superabile, suggerisco di utilizzare l'ultimo algoritmo di crittografia della password. La codifica – KyelJmD

risposta

13

v'è alcun modo per decifrare MD5. Bene, c'è, ma non è ragionevole modo per farlo. Questo è il punto.

Per verificare se qualcuno sta inserendo la password corretta, è necessario MD5 qualunque sia l'utente inserito e vedere se corrisponde a ciò che si ha nel database.

+2

No, non è possibile decrittografare MD5 perché MD5 non è un codice. Ma come probabilmente intendevi la sua reversibilità, puoi solo ricordare le coppie di input + output per una ricerca successiva o cercare di trovare collisioni. Ma non puoi "decodificarlo". – Gumbo

+0

@Gumbo: come funzionano i decodificatori MD5? Indipendentemente dal fatto che memorizzino le stringhe dei valori delle chiavi, il processo suggerisce che MD5 non usa un salt personalizzato, il che significa che può essere invertito se si arriva al nucleo di esso. – Fr0zenFyr

+9

Ecco un modo troppo semplificato di metterlo: 5 + 5 è 10, ma se hai solo 10 non puoi sapere che i numeri originali erano 5 e 5. Tuttavia, se conosci l'algoritmo (prendi due numeri e aggiungili) , quindi è possibile invertire il 10 per ottenere 3 + 7 e sarà accettato perché il risultato è lo stesso. –

2

Gli hash non possono essere decifrati check this out.

Se si desidera crittografare-decodificare, utilizzare una funzione di crittografia bidirezionale del proprio database come - AES_ENCRYPT (in MySQL).

Ma suggerirò l'algoritmo CRYPT_BLOWFISH per l'archiviazione della password. Leggi questo- http://php.net/manual/en/function.crypt.php e http://us2.php.net/manual/en/function.password-hash.php

Per Blowfish da crypt() funzione -

crypt('String', '$2a$07$twentytwocharactersalt$'); 

password_hash sarà introdotto in PHP 5.5.

$options = [ 
    'cost' => 7, 
    'salt' => 'BCryptRequires22Chrcts', 
]; 
password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options); 

Dopo aver memorizzato la password, è possibile controllare se l'utente ha inserito la password corretta da hashing di nuovo e nel confronto con il valore memorizzato.

+3

La nuova funzione 'password_hash()' è una buona raccomandazione, ma perde alcuni dei suoi benefici, quando passi il tuo sale. Lascia che la funzione generi il sale, lo fa in modo crittograficamente sicuro. – martinstoeckli

52

Come già affermato, non è possibile decrittografare MD5 senza tentare qualcosa come l'hacking di forza bruta che è estremamente dispendioso in termini di risorse, non pratico e non etico.

Tuttavia si potrebbe usare qualcosa di simile per cifrare/decifrare le password/etc in modo sicuro:

$input = "SmackFactory"; 

$encrypted = encryptIt($input); 
$decrypted = decryptIt($encrypted); 

echo $encrypted . '<br />' . $decrypted; 

function encryptIt($q) { 
    $cryptKey = 'qJB0rGtIn5UB1xG03efyCp'; 
    $qEncoded  = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($cryptKey), $q, MCRYPT_MODE_CBC, md5(md5($cryptKey)))); 
    return($qEncoded); 
} 

function decryptIt($q) { 
    $cryptKey = 'qJB0rGtIn5UB1xG03efyCp'; 
    $qDecoded  = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($cryptKey), base64_decode($q), MCRYPT_MODE_CBC, md5(md5($cryptKey))), "\0"); 
    return($qDecoded); 
} 

Utilizzando un metodo criptati con un sale sarebbe ancora più sicuro, ma questo sarebbe un buon passo successivo passato usando solo un hash MD5.

+0

Per alcuni ingressi non è in corso la decrittazione corretta, per favore aiuto –

+0

mcrypt_encrypt è già obsoleto in PHP 7.1.0. Affidarsi a questa funzione è altamente scoraggiato. – girish

+0

@girish hai qualche suggerimento su come ottenere un risultato simile con php7? - Stavo per usarlo, e le informazioni che vorrei cifrare non sono affatto importanti: voglio solo ridurre un lungo input $ (che è un percorso) e non voglio che l'utente legga questo percorso, soprattutto perché lunghezza. – Nihvel

5
/* you can match the exact string with table value*/ 

if(md5("string to match") == $res["hashstring"]) 
echo "login correct"; 
+0

ma quella stringa non sarà la stessa per tutti, voglio dire se ci sono 1000 di utenti che stringa di password o stringa di identificazione non sarà la stessa sarebbe una nuova stringa per ogni utente – Sharif

2

Questa domanda viene contrassegnata con PHP. Ma molte persone usano ora il framework Laravel. Potrebbe aiutare qualcuno in futuro. Ecco perché rispondo a Laravel. È più facile crittografare e decifrare con le funzioni interne.

$string = 'c4ca4238a0b923820dcc'; 
$encrypted = \Illuminate\Support\Facades\Crypt::encrypt($string); 
$decrypted_string = \Illuminate\Support\Facades\Crypt::decrypt($encrypted); 

var_dump($string); 
var_dump($encrypted); 
var_dump($decrypted_string); 

Nota: Assicurarsi di impostare una stringa casuale 16, 24, o 32 carattere nel opzione della chiave del file di configurazione/app.php. In caso contrario, i valori crittografati non saranno sicuri.

Ma non si dovrebbe utilizzare la crittografia e la decrittografia per l'autenticazione. Piuttosto dovresti usare hash make e check.

Per memorizzare la password nel database, effettuare l'hash della password e quindi salvare.

$password = Input::get('password_from_user'); 
$hashed = Hash::make($password); // save $hashed value 

Per verificare la password, ottenere la password memorizzata di conto dal database

// $user is database object 
// $inputs is Input from user 
if(\Illuminate\Support\Facades\Hash::check($inputs['password'], $user['password']) == false) { 
    // Password is not matching 
} else { 
    // Password is matching 
} 
+0

Hai un collegamento per completare la documentazione per Crypt? Modalità disponibili, riempimento, estensione chiave password, iv, formato di uscita?In caso contrario, non c'è modo di interoperare o credere che la crittografia sia sicura. [Encrypter] (https://laravel.com/api/5.2/Illuminate/Contracts/Encryption/Encrypter.html) non è sufficiente. – zaph

+0

non funziona la tua crittografia è qualcosa di diverso ... prova a decifrare questo valore –

+0

e decifrato dovrebbe essere 123 –