加密和解密md5
Posted
技术标签:
【中文标题】加密和解密md5【英文标题】:encrypt and decrypt md5 【发布时间】:2013-02-18 03:13:09 【问题描述】:我正在使用代码 $enrypt=md5($pass)
并将 $encrypt
插入数据库。我想找到一种方法来解密它们。我尝试使用解密软件,但它说哈希应该正好是 16 个字节。有什么方法可以解密或使其成为 16 字节 md5 哈希?
我的哈希看起来像这样:c4ca4238a0b923820dcc
【问题讨论】:
你不会解密 MD5... 散列是一种单向运算,意味着它不能被解密。但是,您可以暴力破解散列以找到适合它的输入。 md5 是一种古老且容易破解的密码散列机制,建议您使用最新的密码加密算法。 我看不出这个问题被否决的原因。发帖人可能是学生。 md5 不是加密函数,因此无法解密(因为没有进行实际加密)。这是一个散列函数。 【参考方案1】:无法解密创建的 MD5
哈希。您需要所有信息来解密在加密期间使用的 MD5
值。
可以使用AES
算法加解密
javascript AES encryption and decryption (Advanced Encryption Standard)
【讨论】:
【参考方案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);
注意:请务必在 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
【讨论】:
您有完整的 Crypt 文档链接吗?可用模式、填充、密码密钥扩展、iv、输出格式?如果不是,则无法互操作或相信加密是安全的。 Encrypter 不够用。 老兄,它不工作你的加密是不同的......尝试解密这个 解密后的值应该是123 202cb962ac59075b964b07152d234b70 这里是123的加密【参考方案3】:/* you can match the exact string with table value*/
if(md5("string to match") == $res["hashstring"])
echo "login correct";
【讨论】:
但是每个人的字符串都不一样,我的意思是,如果有 1000 个用户,密码字符串或 id 字符串不会相同,那么每个用户都会是一个新字符串【参考方案4】:如前所述,如果不尝试诸如暴力破解之类的资源密集型、不实用且不道德的操作,就无法解密 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 哈希之后的一个很好的下一步。
【讨论】:
对于某些无法正确解密的输入,请帮助 mcrypt_encrypt 在 PHP 7.1.0 中已被弃用。强烈建议不要依赖此函数。 @girish 您对如何使用 php7 实现类似结果有什么建议吗? - 我打算使用它,我要加密的信息根本不重要:我只想缩小一个长 $input (这是一个路径)并且不希望用户阅读这个路径,主要是因为它长度。 不确定。但是没有办法在 PHP 中解密散列密码。也许您必须使用字符串反向进行 base64 编码和解码,也可能需要您选择的 SALT 键。 这个答案还在更新吗?现在是 2019 年,md5 的处理能力相当低。有人不能在合理的时间内暴力破解吗?【参考方案5】:哈希无法解密check this out。
如果您想加密-解密,请使用数据库的双向加密功能,例如 - AES_ENCRYPT(在 mysql 中)。
但我会建议使用 CRYPT_BLOWFISH 算法来存储密码。阅读这篇文章-http://php.net/manual/en/function.crypt.php 和 http://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);
一旦您存储了密码,您就可以通过再次散列密码并将其与存储的值进行比较来检查用户是否输入了正确的密码。
【讨论】:
新函数password_hash()
是一个很好的推荐,但是当你传递自己的盐时,它会失去一些好处。只需让函数生成盐,它以加密安全的方式进行。【参考方案6】:
没有办法解密 MD5。嗯,有,但没有合理的方法来做到这一点。这就是重点。
要检查是否有人输入了正确的密码,您需要对用户输入的任何内容进行 MD5,并查看它是否与您在数据库中的密码匹配。
【讨论】:
不,没有办法解密 MD5,因为 MD5 不是密码。但正如您可能意味着它的可逆性,您只能记住输入+输出对以供以后查找或尝试查找冲突。但你不能“解密”它。 @Gumbo:MD5 解密器是如何工作的?它们是否存储键值字符串并不重要,该过程表明 MD5 不使用自定义盐,这意味着如果您深入到它的核心,它可以被反转。 这是一种过于简化的表达方式:5+5 是 10,但如果你只有 10,你就无法知道原始数字是 5 和 5。但是,如果你知道算法 (取两个数相加),然后你可以将 10 颠倒得到 3+7,它会被接受,因为结果是一样的。 @Fr0zenFyr 它们只是巨大的查找表:任何已知的哈希都映射到用于生成它的输入;如果有人查找已知的哈希,您将获得输入值。 @Kolink 没那么容易。 Cryptographic hash functions 应该具有生成具有给定哈希的输入的不可行的属性(前映像攻击)。以上是关于加密和解密md5的主要内容,如果未能解决你的问题,请参考以下文章