2013-03-04 28 views
51

Używam kodu $enrypt=md5($pass) i wstawienie $encrypt do bazy danych. Chcę znaleźć sposób na ich odszyfrowanie. Próbowałem użyć oprogramowania deszyfrującego, ale mówi, że hash powinien mieć dokładnie 16 bajtów. czy istnieje sposób na odszyfrowanie go lub uczynienie go 16-bitowym hashem md5?szyfrowanie i odszyfrowywanie md5

Moja hash wygląda następująco: c4ca4238a0b923820dcc

+11

Nie odszyfrować MD5 ... – sachleen

+6

Hashing jest operacją jednokierunkową, co oznacza, że ​​nie można odszyfrować. Jednak możesz wymusić mieszanie hasza, aby znaleźć dane wejściowe dla niego. – Vulcan

+2

md5 to stary i łatwy do złamania mechanizm hashowania hasłem, sugeruję użycie najnowszego algorytmu szyfrowania haseł. – KyelJmD

Odpowiedz

13

Nie ma sposobu, aby odszyfrować MD5. No cóż, nie ma sposobu, aby to zrobić. Właśnie o to chodzi.

Aby sprawdzić, czy ktoś wprowadza poprawne hasło, musisz wprowadzić MD5, niezależnie od wprowadzonego przez użytkownika, i sprawdzić, czy pasuje do tego, co masz w bazie danych.

+2

Nie, nie da się odszyfrować MD5, ponieważ MD5 nie jest szyfrem. Ale ponieważ prawdopodobnie chodziło o jego odwracalność, można tylko pamiętać pary wejścia i wyjścia dla późniejszego wyszukiwania lub spróbować znaleźć kolizje. Ale nie można tego "odszyfrować". – Gumbo

+0

@Gumbo: jak działają dekodery MD5? Nie ma znaczenia, czy przechowują łańcuchy wartości kluczy, proces sugeruje, że MD5 nie używa niestandardowej soli, co oznacza, że ​​można ją odwrócić, jeśli dojdziesz do jej sedna. – Fr0zenFyr

+9

Oto uproszczony sposób umieszczenia go: 5 + 5 to 10, ale jeśli masz 10, nie możesz wiedzieć, że pierwotne liczby to 5 i 5. Jeśli znasz algorytm (weź dwie liczby i dodaj je) , możesz odwrócić 10, aby uzyskać 3 + 7 i zostanie zaakceptowany, ponieważ wynik jest taki sam. –

2

Hasch nie można odszyfrować check this out.

Jeśli chcesz zaszyfrować-odszyfrować, użyj dwukierunkowej funkcji szyfrowania bazy danych, takiej jak - AES_ENCRYPT (w MySQL).

Ale zasugeruję algorytm CRYPT_BLOWFISH do przechowywania hasła. Czytaj this- http://php.net/manual/en/function.crypt.php i http://us2.php.net/manual/en/function.password-hash.php

Dla Blowfish przez crypt() funkcji -

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

password_hash zostanie wprowadzony w PHP 5.5.

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

Po zapisaniu hasła, możesz sprawdzić, czy użytkownik wprowadził prawidłowe hasło, mieszania go ponownie i porównując ją z zapisaną wartością.

+3

Nowa funkcja 'password_hash()' jest dobrą rekomendacją, ale traci część korzyści, kiedy przekazujesz własną sól. Po prostu niech funkcja generuje sól, robi to w sposób bezpieczny pod kryptografią. – martinstoeckli

52

Jak już wspomniano, nie można odszyfrować MD5 bez próby użycia hakerów typu Brute Force, co jest niezwykle kosztowne, niepraktyczne i nieetyczne.

Jednakże można użyć coś podobnego do szyfrowania/deszyfrowania haseł/etc bezpiecznie:

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

Stosując metodę encypted z solą byłby jeszcze bezpieczniejsze, ale to byłby dobry następny krok przeszłość tylko przy użyciu skrót MD5.

+0

Dla niektórych wejść nie jest poprawnie odszyfrowywania, Proszę pomóc –

+0

mcrypt_encrypt jest już przestarzałe w PHP 7.1.0. Opieranie się na tej funkcji jest wysoce odradzane. – girish

+0

@girish czy masz jakieś sugestie, jak osiągnąć podobny wynik z php7? - Miałem zamiar go użyć, a informacje, które chciałabym zaszyfrować, nie są wcale ważne: chcę tylko zmniejszyć długie wejście $ (które jest ścieżką) i nie chcę, aby użytkownik przeczytał tę ścieżkę, głównie dlatego, że długość. – Nihvel

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

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

ale ten ciąg nie będzie taki sam dla wszystkich, mam na myśli to, że jeśli istnieje 1000 użytkownika, ciąg znaków lub ciąg znaków nie będą takie same, będzie to nowy ciąg dla każdego użytkownika – Sharif

2

To pytanie jest oznaczone jako PHP. Ale wiele osób korzysta teraz z frameworka Laravel. To może pomóc komuś w przyszłości. Właśnie dlatego odpowiadam za Laravel. Łatwiej jest szyfrować i odszyfrowywać za pomocą funkcji wewnętrznych.

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

Uwaga: Pamiętaj, aby ustawić 16, 24, lub 32 znakowy ciąg losowy w kluczowych opcji w pliku konfiguracyjnym/app.php . W przeciwnym razie zaszyfrowane wartości nie będą bezpieczne.

Ale nie należy używać szyfrowania i odszyfrowywania w celu uwierzytelnienia. Zamiast tego powinieneś używać hash make i check.

Aby zapisać hasło w bazie danych, wykonaj haszowanie hasła, a następnie zapisz.

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

Aby zweryfikować hasło, uzyskać hasło zapisane na rachunku z bazy

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

Czy masz link do pełnej dokumentacji dla Crypt? Dostępne tryby, padding, rozszerzenie klucza hasła, iv, format wyjściowy?Jeśli nie, nie ma sposobu na współdziałanie lub przekonanie, że szyfrowanie jest bezpieczne. [Encrypter] (https://laravel.com/api/5.2/Illuminate/Contracts/Encryption/Encrypter.html) jest niewystarczający. – zaph

+0

stary, że nie działa twoje szyfrowanie jest czymś innym ... spróbuj odszyfrować to –

+0

, a odszyfrowana wartość powinna być 123 –

Powiązane problemy