加密和解密MD5

76
我正在使用代码$enrypt=md5($pass),并将$encrypt插入到数据库中。 我想找出一种解密它们的方法。 我尝试使用解密软件,但它说哈希应该刚好为16个字节。 有没有办法解密它或使它成为一个16字节的MD5哈希?
我的哈希值看起来像这样:c4ca4238a0b923820dcc

17
你不能解密MD5... - sachleen
8
哈希是一种单向操作,意味着它无法被解密。然而,您可以使用暴力破解的方法来查找符合该哈希的输入内容。 - FThompson
4
MD5 是一种老旧且容易被破解的密码哈希机制,我建议您使用最新的密码加密算法。 - KyelJmD
8
我不明白为什么这个问题被踩了。发帖人可能是一名学生。 - KyelJmD
6
MD5不是加密函数,因此它不能被解密(因为实际上没有进行加密)。它是一种哈希函数。 - ccKep
显示剩余2条评论
6个回答

78

如已经声明,你不能解密MD5,除非尝试像暴力破解一样的黑客攻击,这是极其耗费资源的,不切实际且不道德的。

但是,你可以使用类似下面这样的方法来安全地加密/解密密码等:

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

使用带盐的加密方法会更安全,但这比仅使用MD5哈希值更进一步。


1
对于某些输入,它无法正确解密,请帮忙。 - Sukhwinder Sodhi
3
在PHP 7.1.0版本中,mcrypt_encrypt已经被弃用。强烈不建议依赖此函数。 - girish
@girish,你有没有关于如何在php7中实现类似结果的建议?-我打算使用它,并且我要加密的信息根本不重要:我只想缩短一个长的$input(它是一个路径),并且不希望用户阅读此路径,主要是因为其长度。 - aPugLife
不确定,但在PHP中没有解密哈希密码的方法。也许您需要使用base64编码和解码,再加上字符串反转和您选择的SALT密钥。 - girish
这个答案还更新吗?现在已经是2019年了,md5的处理能力相当低。有人不能在合理的时间内暴力破解它吗? - Freedo

19
没有办法解密MD5。嗯,其实有方法,但是没有合理的方法可以做到。这就是重点。
为了检查某人是否输入了正确的密码,您需要对用户输入的任何内容进行MD5处理,并查看它是否与数据库中的内容匹配。

3
不,无法解密MD5,因为MD5不是密码。但是,如果您指的是其可逆性,您只能记住输入+输出对以供稍后查找,或者尝试寻找碰撞。但您无法“解密”它。 - Gumbo
13
简而言之,5加5等于10,但如果你只有10,你无法知道原来的数字是5和5。然而,如果你知道算法(取两个数字相加),那么你可以反推出10的来源是3+7,并且这个答案也是正确的。 - Niet the Dark Absol
@Fr0zenFyr它们只是巨大的查找表:任何已知的哈希都被映射到生成它的输入上;如果有人查找已知的哈希,你将得到输入值。 - Gumbo
@Kolink 这并不容易。密码哈希函数应该具有这样的属性,即生成具有给定哈希值的输入是不可行的(预像攻击)。 - Gumbo
@Fr0zenFyr MD5是一种完全确定性函数。在任何系统上,输入X始终会产生哈希Y。然而,它并不是一个简单的函数。实际上,加密哈希函数应该满足特定标准,这些标准使您的假设无效。 - Gumbo
显示剩余2条评论

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

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

但是这个字符串对于每个人来说都不会相同,我的意思是如果有成千上万的用户,那么密码字符串或ID字符串对于每个用户来说都会是一个新的字符串。 - Sharif

5

这个问题被标记为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);

注意:请务必在config/app.php文件的key选项中设置一个16、24或32个字符的随机字符串。否则,加密值将不安全。

但是你不应该使用加密和解密进行身份验证。相反,你应该使用哈希函数make和check。

为了将密码存储在数据库中,请先对密码进行哈希处理,然后保存。

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

你有 Crypt 的完整文档链接吗?包括可用模式、填充、密码密钥扩展、iv、输出格式等信息。如果没有这些信息,就无法相互操作或相信加密是安全的。Encrypter 是不够的。 - zaph
老兄,它不起作用,你的加密是有些不同的... 试着解密这个。 - nirav jobanputra
解密后的值应为123。 - nirav jobanputra
202cb962ac59075b964b07152d234b70 这是数字123的加密结果。 - nirav jobanputra

5

1
页面未找到。也许这可以帮助您:https://javascript.tutorialink.com/javascript-aes-encryption-and-decryption-advanced-encryption-standard/ - statosdotcom

2

哈希值无法解密,点击这里了解更多。

如果您想要加密解密,请使用数据库的双向加密函数,例如MySQL中的AES_ENCRYPT。

但我建议使用CRYPT_BLOWFISH算法来存储密码。请阅读这篇文章- http://php.net/manual/en/function.crypt.phphttp://us2.php.net/manual/en/function.password-hash.php

对于crypt()函数的Blowfish:

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

password_hash会在PHP 5.5中引入。

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

一旦您存储了密码,您可以通过再次进行哈希并将其与存储的值进行比较来检查用户是否输入了正确的密码。


3
新的函数password_hash()是个不错的建议,但当你自己传入盐值时会失去一些好处。最好让这个函数自动生成盐值,它能以一种安全的加密方式生成盐值。 - martinstoeckli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接