2013-03-04 16 views
51

Ich benutze Code $enrypt=md5($pass) und Einfügen $encrypt in die Datenbank. Ich möchte einen Weg finden, sie zu entschlüsseln. Ich habe versucht, eine Entschlüsselungssoftware zu verwenden, aber es besagt, dass der Hash genau 16 Byte sein sollte. Gibt es eine Möglichkeit, es zu entschlüsseln oder es zu einem 16-Byte-MD5-Hash zu machen?verschlüsseln und entschlüsseln md5

Mein Hash sieht wie folgt aus: c4ca4238a0b923820dcc

+11

Sie MD5 nicht entschlüsseln gespeichert bekommen ... – sachleen

+6

Hashing ist ein Ein-Wege-Betrieb, es entschlüsselt kann nicht sein Sinn. Sie können jedoch den Hash-Wert brute-force, um herauszufinden, welche Eingabe (n) dafür arbeiten. – Vulcan

+2

md5 ist ein alter und leicht breakable Passwort-Hashing-Mechanismus, ich schlage vor, Sie verwenden die neuesten Passwort-Verschlüsselungsalgorithmus. – KyelJmD

Antwort

13

Es gibt keine Möglichkeit, MD5 zu entschlüsseln. Nun, es gibt, aber keine vernünftigen Weg, es zu tun. Das ist der Punkt.

Um zu überprüfen, ob jemand das richtige Passwort eingibt, müssen Sie MD5 unabhängig vom Benutzer eingeben und prüfen, ob es mit dem übereinstimmt, was Sie in der Datenbank haben.

+2

Nein, MD5 kann nicht entschlüsselt werden, weil MD5 keine Chiffre ist. Aber wie Sie wahrscheinlich seine Reversibilität gemeint haben, können Sie sich nur an Input + Output-Paare für eine spätere Suche erinnern oder versuchen, Kollisionen zu finden. Aber Sie können es nicht "entschlüsseln". – Gumbo

+0

@Gumbo: Wie funktionieren die MD5-Entschlüsseler? Es spielt keine Rolle, ob sie die Schlüsselwertstrings speichern, der Prozess legt nahe, dass MD5 kein benutzerdefiniertes Salz verwendet, was bedeutet, dass es umgekehrt werden kann, wenn Sie den Kern davon kennen. – Fr0zenFyr

+9

Hier ist eine vereinfachte Darstellung: 5 + 5 ist 10, aber wenn Sie nur 10 haben, können Sie nicht wissen, dass die ursprünglichen Zahlen 5 und 5 waren. Wenn Sie jedoch den Algorithmus kennen (nehmen Sie zwei Zahlen und fügen Sie sie hinzu) , dann können Sie die 10 umkehren, um 3 + 7 zu erhalten, und es wird akzeptiert, weil das Ergebnis dasselbe ist. –

2

Hashes können nicht entschlüsselt werden check this out.

Wenn Sie verschlüsseln-entschlüsseln möchten, verwenden Sie eine Zwei-Wege-Verschlüsselungsfunktion Ihrer Datenbank wie - AES_ENCRYPT (in MySQL).

Aber ich werde CRYPT_BLOWFISH Algorithmus zum Speichern von Passwort vorschlagen. Lesen this- http://php.net/manual/en/function.crypt.php und http://us2.php.net/manual/en/function.password-hash.php

Für Blowfish von crypt() Funktion -

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

password_hash wird in PHP 5.5 eingeführt werden.

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

Sobald Sie das Passwort gespeichert haben, können Sie dann prüfen, ob der Benutzer durch erneuten Hashing richtiges Passwort eingegeben hat, und es mit dem gespeicherten Wert verglichen wird.

+3

Die neue Funktion 'password_hash()' ist eine gute Empfehlung, aber sie verliert einige ihrer Vorteile, wenn Sie Ihr eigenes Salz weitergeben. Lassen Sie die Funktion das Salz erzeugen, und zwar auf kryptographisch sichere Weise. – martinstoeckli

52

Wie bereits erwähnt, können Sie MD5 nicht entschlüsseln, ohne etwas wie Brute-Force-Hacking zu versuchen, das extrem ressourcenintensiv, nicht praktisch und unethisch ist.

auch immer Du so etwas wie dies nutzen könntest zum Verschlüsseln/Entschlüsseln Passwörter/etc sicher:

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

ein verschlüsselt gespeichert Verfahren mit einem Salz verwenden wären noch sicherer, aber das wäre eine gute nächste Schritt Vergangenheit nur mit ein MD5-Hash.

+0

Für einige der Eingänge entschlüsselt es nicht richtig, bitte help –

+0

mcrypt_encrypt ist bereits in PHP 7.1.0 veraltet. Von dieser Funktion wird dringend abgeraten. – girish

+0

@girish hast du einen Vorschlag, wie man mit php7 ein ähnliches Ergebnis erzielen kann? - Ich würde es benutzen, und die Informationen, die ich verschlüsseln würde, sind überhaupt nicht wichtig: Ich möchte nur einen langen $ -Eingabe (was ein Pfad ist) verkleinern und möchte nicht, dass der Benutzer diesen Pfad liest, hauptsächlich weil es Länge. – Nihvel

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

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

aber diese Zeichenfolge wird nicht für alle gleich sein, ich meine, wenn es 1000 von Benutzer, die Passwort-Zeichenfolge oder ID-Zeichenfolge wird nicht identisch sein, wäre es eine neue Zeichenfolge für jeden Benutzer – Sharif

2

Diese Frage ist verschlagwortet mit PHP. Aber viele Leute benutzen Laravel Framework jetzt. Es könnte jemandem in Zukunft helfen. Deshalb antworte ich für Laravel. Es ist einfacher, mit internen Funktionen zu verschlüsseln und zu entschlüsseln.

$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); 

Hinweis: Achten Sie darauf, eine 16, 24 oder 32 Zeichen zufällige Zeichenfolge im Schlüsseloption der config/app.php Datei einzustellen. Andernfalls sind die verschlüsselten Werte nicht sicher.

Aber Sie sollten nicht für die Authentifizierung verschlüsseln und entschlüsseln verwenden. Stattdessen sollten Sie Hash-make und check verwenden.

Um das Passwort in der Datenbank zu speichern, machen Sie einen Hash des Passworts und speichern Sie es.

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

Passwort Um zu überprüfen, Passwort des Kontos aus der Datenbank

// $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

Haben Sie einen Link zur vollständigen Dokumentation für Crypt? Verfügbare Modi, Padding, Passwort Key Extension, iv, Ausgabeformat?Wenn nicht, gibt es keine Möglichkeit zu interoperieren oder zu glauben, dass die Verschlüsselung sicher ist. [Encrypter] (https://laravel.com/api/5.2/Illuminate/Contracts/Encryption/Encrypter.html) ist nicht ausreichend. – zaph

+0

Alter es funktioniert nicht Ihre Verschlüsselung ist etwas anderes ... versuchen Sie, diese –

+0

zu entschlüsseln und der entschlüsselte Wert sollte 123 sein –

Verwandte Themen