70

我正在使用代码$enrypt=md5($pass)并插入$encrypt数据库。我想找到一种方法来解密它们。我尝试使用解密软件,但它说哈希应该正好是 16 个字节。有什么方法可以解密或使其成为 16 字节 md5 哈希?

我的哈希看起来像这样:c4ca4238a0b923820dcc

4

6 回答 6

73

如前所述,如果不尝试诸如暴力破解之类的资源密集型、不实用且不道德的事情,就无法解密 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 哈希。

于 2013-03-04T05:02:22.677 回答
18

没有办法解密 MD5。嗯,有,但没有合理的方法来做到这一点。这就是重点。

要检查是否有人输入了正确的密码,您需要对用户输入的任何内容进行 MD5,并查看它是否与您在数据库中的内容匹配。

于 2013-03-04T04:43:04.740 回答
6
/* you  can match the exact string with table value*/

if(md5("string to match") == $res["hashstring"])
 echo "login correct";
于 2013-10-27T15:19:44.617 回答
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 个字符的随机字符串。否则,加密值将不安全。

但是您不应该使用加密和解密进行身份验证。相反,您应该使用哈希生成和检查。

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

$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 
}
于 2016-01-30T10:22:00.200 回答
4

无法解密MD5创建的哈希。您需要所有信息来解密MD5在加密期间使用的值。

您可以使用AES算法来加密和解密

JavaScript AES 加密和解密(高级加密标准)

于 2018-08-03T07:32:10.900 回答
2

散列不能被解密检查这个

如果要加密-解密,请使用数据库的双向加密功能,例如 - AES_ENCRYPT(在 MySQL 中)。

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

对于河豚的crypt()功能 -

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

password_hash将在 PHP 5.5 中引入。

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

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

于 2013-03-04T04:54:52.063 回答