2013-03-04 213 views
51

我正在使用代碼$enrypt=md5($pass)並將$encrypt插入數據庫。我想找出解密方法。我嘗試使用解密軟件,但它說哈希應該是正好16個字節。有沒有辦法解密它或使其成爲一個16字節的MD5散列?加密和解密md5

我的哈希看起來是這樣的:c4ca4238a0b923820dcc

+11

你不解密MD5獲取存儲帳戶的密碼... – sachleen 2013-03-04 04:42:09

+6

散列是單向操作,這意味着它不能被解密。但是,您可以蠻力強制散列來查找哪些輸入適用於它。 – Vulcan 2013-03-04 04:42:21

+2

md5是一個古老而容易破解的密碼哈希機制,我建議你使用最新的密碼加密算法。 – KyelJmD 2013-03-04 04:42:47

回答

13

沒有辦法解密MD5。那麼有,但沒有合理的方式來做到這一點。這點很重要。

要檢查是否有人輸入了正確的密碼,無論用戶輸入什麼內容,都需要MD5,並查看它是否與數據庫中的內容相符。

+2

不,沒有辦法解密MD5,因爲MD5不是密碼。但是,因爲您可能意味着它的可逆性,所以您只能記住輸入+輸出對,以便稍後查找或嘗試查找衝突。但是你不能'解密'它。 – Gumbo 2013-03-04 04:59:13

+0

@Gumbo:MD5解密器如何工作?無論他們是否存儲關鍵值字符串,該過程都表明MD5不會使用自定義鹽,這意味着如果您到達其核心,它可以被逆轉。 – Fr0zenFyr 2013-06-14 04:52:23

+9

這裏是把它的過於簡單的方式:5 + 5是10,但如果你只是有10你可以不知道,原來數分別爲5和5。但是,如果你知道算法(取兩個數字並把它們) ,那麼你可以反轉10得到3 + 7,它會被接受,因爲結果是相同的。 – 2013-06-14 04:55:31

2

哈希不能解密check this out

如果要加密解密,請使用數據庫的雙向加密函數,如 - AES_ENCRYPT(在MySQL中)。

但我會建議CRYPT_BLOWFISH算法存儲密碼。通過crypt()功能閱讀這 - http://php.net/manual/en/function.crypt.phphttp://us2.php.net/manual/en/function.password-hash.php

對於河豚 -

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

password_hash將在PHP 5.5中引入。

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

一旦存儲的密碼,就可以檢查用戶是否再次散列並將其與存儲的值進行比較,輸入正確的密碼。

+3

新函數'password_hash()'是一個很好的建議,但是當你傳遞自己的salt時,它會失去它的一些好處。只要讓函數生成鹽,它就會以密碼安全的方式執行。 – martinstoeckli 2013-03-04 08:46:10

52

如前所述,如果不嘗試類似暴力破解這樣的資源密集型,不實用和不道德的行爲,就無法解密MD5。

但是你可以使用這樣的加密/解密密碼的/ etc安全:

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

使用encypted方法與鹽會更安全,但是這將是一個很好的下一步過去只是用一個MD5哈希。

+0

對於有些人來說是不正確的解密,請幫 – 2018-01-04 15:08:54

+0

mcrypt_encrypt的投入已經棄用PHP 7.1.0。依靠這個功能是非常不鼓勵的。 – girish 2018-02-27 11:02:08

+0

@girish你有什麼建議如何實現類似的結果與php7? - 我打算使用它,並且我要加密的信息根本不重要:我只想縮小長輸入(這是一個路徑),並且不希望用戶閱讀此路徑,主要是因爲它的長度。 – Nihvel 2018-03-01 16:02:16

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

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

但該字符串不會是每個人都一樣,我的意思是,如果有1000個用戶的該密碼字符串或ID字符串不會相同這將是一個新的字符串爲每個用戶 – Sharif 2014-08-18 11:57:35

2

此問題標記爲PHP。但是很多人現在都在使用Laravel框架。它可能會在未來幫助某人。這就是爲什麼我回答Laravel。用內部函數進行加密和解密更容易。

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

注:一定要設置一個16,24,或32個字符的隨機字符串在config/app.php文件的 密鑰選項。否則,加密值 將不安全。

但是,您不應該使用加密和解密進行身份驗證。相反,你應該使用散列製作和檢查。

要將密碼存儲在數據庫中,請對密碼進行散列並保存。

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

要驗證密碼,從數據庫

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

你有一個鏈接,即可完成文檔地穴?可用模式,填充,密碼密鑰擴展,iv,輸出格式?如果沒有,則無法互操作或認爲加密是安全的。 [加密器](https://laravel.com/api/5.2/Illuminate/Contracts/Encryption/Encrypter.html)不足。 – zaph 2016-01-30 15:34:04

+0

花花公子它不工作的加密是不同的東西...嘗試解密這個 – 2016-05-17 06:44:26

+0

和解密的值應該是123 – 2016-05-17 06:45:02