2013-03-04 146 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