php中如何使用MD5码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php中如何使用MD5码相关的知识,希望对你有一定的参考价值。

MD5码和普通字符的转换

首先介绍一下php中MD5函数的使用方法:
<?php

$pswd1=md5("cenusdesign");
echo $pswd1; //运行结果为:fc60ec37d1c08d5b0fb67a8cd934d5ba
$pswd2=md5("Cenusdesign");
echo $pswd2; //运行结果为:067577d9fc109c80538c81d6f02bd293
?>

显然,经过md5加密后,原本“cenusdesign”转变成了一组32位的字符串,而且,即使是一个字母的大小写变化,这组字符串就会发生巨大的变化。
Cenus Design建议把用户注册时,将密码首先经过MD5转换,然后将转换加密后的数据库。在用户登陆时,也将密码先进行MD5转化,再和数据库中那组经过MD5加密的字符串进行比较。这样,就可以做到在不知道用户确切密码的情况下完成密码的比对操作。
参考技术A md5 算法是不可逆的(不过好像已经有人破解了,不是那么容易就逆回去的),
你可以用
$pss ="123456";
$password = md5($pass); //得到e10adc3949ba59abbe56e057f20f883e

但是你没办法 e10adc3949ba59abbe56e057f20f883e 得到 123456本回答被提问者采纳
参考技术B $s = md5("这是要转换的内容。");

PHP:如何在用户点击忘记密码时将原始密码发送给使用md5加密的用户?

【中文标题】PHP:如何在用户点击忘记密码时将原始密码发送给使用md5加密的用户?【英文标题】:PHP:How to send the original password to the user when he clicks forgot password which is encrypted by using md5? 【发布时间】:2011-02-16 08:03:38 【问题描述】:

我正在使用 md5 加密项目中的密码。

当用户点击忘记密码并提交他的电子邮件时,我必须将他的密码发送给他。

但是密码是使用md5加密的。不应该生成新密码。因为在这个项目中管理员可以看到用户的所有详细信息。所以我必须向管理员显示原始密码。所以初始密码非常重要。那么如何解密密码或以任何其他方式向他发送原始密码?

提前谢谢...

【问题讨论】:

md5 的重点不是以明文形式存储密码;你问的是不合逻辑的,只是错误 @jamiei:不知道,如果我们有这样的标签,就意味着这样的帖子是有效的。恕我直言,一个将被授予此类标签的帖子,无论如何都应该关闭。 @jamiei:问你就会收到。这篇文章现在被标记为“有缺陷的概念”。 我想补充一点,在某些国家/地区可能实际查看用户的密码或以不阻止这种情况的方式存储它们是非法的。 @Lo'oris:我不同意。这是一个有效的问题(特别是对于这样一个经常出现的有缺陷的概念),应该适当地回答这个问题,并解释为什么你真的不想这样做,而不是关闭。 【参考方案1】:

哈希不是为解密而设计的,这就是为什么它们通常被称为“单向哈希”而不仅仅是哈希。

相反,要么...

    生成一个新密码,对其进行哈希处理,将新密码哈希值存储在旧密码的位置,并将新生成的密码通过电子邮件发送给用户。

    生成新密码,对其进行哈希处理,将其存储在临时密码字段中,然后当用户使用该密码登录时,提示他们输入永久新密码。

    生成 nonce,将其存储在 nonce 字段中,并通过电子邮件向用户发送包含该 nonce 的链接,这将使他们能够访问页面以输入新密码。

    李>

第三个选项可能是最好的,因为它不会让阅读用户电子邮件的人清楚地看到实际密码(临时或非临时密码),并且由于它使用随机数,一旦使用它不能被恶意用户再次使用。

对密码使用散列的原因是专门为了防止它们以恶意用户可以通过查看数据库来确定密码的形式存储。

编辑:

“所以我必须向管理员显示原始密码。”

如果您要对密码进行哈希处理,这是不可能。一般来说,允许管理员查看用户的密码实际上是一个坏主意,因为很大一部分用户倾向于在多件事上使用相同的密码,而管理员则对一件事(比如,公司网络)可能不是许多其他事物(例如,用户的网上银行系统)的管理员。

MD5不是加密算法,是散列算法。两者不一样;加密被设计为可逆的(因此补充术语“解密”),而散列被设计为单向的。

【讨论】:

您真的不想将它存储在旧的位置...要么使用单独的 temp_password 字段,要么发送一个一次性链接,他可以使用它来更改密码(第二个稍微安全一些,因为密码不会留在他的邮箱中)。 更新了答案以包含更多选项。 :) @Amber 我正在检查如何 dycrypt md5 密码,这个网站做得很好..所以它可以逆转!?试试md5decrypter.co.uk 对我来说很好 @Basit - 因为虽然 MD5 是一种单向算法,但它也是一种 算法 - MD5 早就被破解到了破解者简单暴力破解的地步他们通过所有的哈希(见rainbow table)。这就是为什么不建议将 MD5 用于密码存储的原因 - 像 bcrypt 这样的算法需要更长的时间来暴力破解是当前的标准。【参考方案2】:

如果密码已经过哈希处理,那么您可能必须创建一个随机密码并将其发送给用户。然后,一旦他们登录,将他们带到更改密码屏幕,以便他们可以将密码更改为更容易记住的内容。

【讨论】:

【参考方案3】:

哈希值的一个特定目的(除其他外)是它是不可逆的,如果它完美地工作的话。

“忘记密码”功能最常见的方法是生成一个新密码并告诉您的用户尽快更改它。

【讨论】:

【参考方案4】:

你不能。加密哈希 [1] 被称为“不可逆”的原因是它们不能被反转。这就是将它们用于密码存储的全部意义所在——这意味着,如果一个坏人掌握了密码数据库,他不能仅仅通过反转哈希来找出所有密码是什么。

我从您的编辑中看到,您的意图是向管理员用户显示用户的密码,而不是让用户自己恢复密码。这是一个非常糟糕的主意。许多用户试图通过在多个系统上使用相同的密码来减轻记住密码的负担,这意味着在您的系统中显示他们的密码很可能会在其他上泄露他们的帐户em> 系统。

真实故事:早在 2000 年,我在一家生产语音邮件系统的初创公司找到了一份工作。为了在第一天向我介绍该产品,IT 主管让我创建了一个语音邮件帐户,我照做了,然后他在管理界面中提出了它。当我看到我的语音信箱 PIN 显示在屏幕上供所有人查看时,我差点死了。部分是因为这是非常糟糕的安全做法,但主要是因为,即使他不知道,他现在知道我的 ATM 卡的 PIN。这只是糟糕,糟糕,糟糕。不要那样做。


[1] MD5 是散列算法,不是加密算法。两者之间的主要区别在于,对于任何给定的散列算法,有无限数量的输入会产生相同的输出(这就是它不可逆的原因),而加密具有与输入的一一对应关系输出。

【讨论】:

【参考方案5】:

只是将其添加为旁注:

虽然您无法“取消哈希”MD5 哈希,但您可以在 Rainbow 表中查找它。 可能允许您将原始明文密码发送给用户。 我不建议这样做,因为与创建新密码并将其发送给用户相比,这只是浪费资源。

来自http://en.wikipedia.org/wiki/Rainbow_table:

彩虹表是一种查找表,它提供时间-内存权衡,用于从散列函数(通常是加密散列函数)生成的密码散列中恢复明文密码。一个常见的应用是使对散列密码的攻击变得可行。盐通常与散列密码一起使用,以使这种攻击更加困难,通常是不可行的。

有关其他说明,另请参阅下面的 cmets。

【讨论】:

为了避免对此投反对票,我只想说尝试解密完全没有用的密码是一个非常非常愚蠢的想法。不要尝试解密密码,正如这个答案所说(虽然理论上是可能的)。 即使您有一个包含匹配哈希的彩虹表,这也很可能 不是 用户的原始密码 - 有无限数量的明文输入将哈希到任何给定 MD5 结果。而且,正如@David_001 所说,即使它是用户的原始密码也不会有用。我从未遇到过管理员有正当理由知道其他用户密码的情况。

以上是关于php中如何使用MD5码的主要内容,如果未能解决你的问题,请参考以下文章

在php5中md5在加密字符串后如何解密

在php5中md5在加密字符串后如何解密

如何在php中获取文件的md5? [复制]

如何在javascript中使用MD5传输密码

如何在ubuntu系统中验证系统文件的md5

请问在ASP中如何验证有JAVA传过来的MD5SUM后的密码