什么是md5()的?

我正在阅读本教程的一个简单的PHPlogin系统 。

最后,build议您使用md5()encryption密码 。

虽然我知道这是一个初学者的教程,你不应该把银行账单放在这个login系统后面,这让我想到了encryption。

所以我继续前进(本网站对新手最有用的问题之一): 开发者在build立公共网站之前应该知道什么?

那里说(安全)你应该:

encryption哈希和盐密码,而不是将其存储为纯文本。

它没有多说这个,没有提及。

所以我自己去尝试一下:

$pass = "Trufa"; $enc = md5($pass); echo $enc; #will echo 06cb51ce0a9893ec1d2dce07ba5ba710 

这就是让我思考的问题,虽然我知道md5()可能不是最强的encryption方式,但是总是产生相同结果的任何东西都可以被反向devise。

那么用md5()或其他方法encryption某些东西有什么意义呢?

如果黑客获得用md5()encryption的密码, 他只会使用这个页面! 。

所以现在的实际问题是:

  1. 密码encryption如何工作?

我知道我没有在这里发现一个巨大的网页漏洞! :)我只是想了解密码encryption背后的逻辑。

我敢肯定,我正在理解一些错误的东西,并希望能够帮助我设定我和其他人(我希望)。

你将如何应用密码encryption,这实际上是有用的?

  1. 这个主意呢?

正如我所说,我可能将整个想法弄错了,但是,这种方法是否会增加安全性以保护真实环境?

 $reenc = array( "h38an", "n28nu", "fw08d" ); $pass = "Trufa"; $enc = chunk_split(md5($pass),5,$reenc[mt_rand(0,count($reenc)-1)]); echo $enc; 

正如你所看到的,我随机添加了任意string( $reenc = array() )给我的md5()密码“使其唯一”。 这当然是一个愚蠢的例子。

我可能是错的,但除非你“亲自encryptionencryption”,否则它总是很容易被逆转。

以上是我的“密码保护”和encryption密码的想法,如果黑客得到它,他将无法解密它,除非他获得原始的.php

我知道这可能没有意义,但我不明白为什么这是一个坏主意!


我希望我已经明确了自己,但是这是一个很长的问题, 请您澄清一下。

提前致谢!!

你应该有一个像md5sha512 encryption 。 你也应该有两种不同的盐,一种是static salt (由你写的),然后是一个特定的密码unique salt

一些示例代码(例如registration.php):

 $unique_salt = hash('md5', microtime()); $password = hash('md5', $_POST['password'].'raNdoMStAticSaltHere'.$unique_salt); 

现在,你有一个static salt ,它是存储在.php文件中的所有密码都有效的。 然后,在注册执行时,您将为该特定密码生成一个unique hash

这一切都结束了:拼写完全相同的两个密码,将有两个不同的hashesunique hash与当前的ID一起存储在database 。 如果有人抓取database ,他们将有每一个特定的密码unique salt每个。 但是他们没有的是static salt ,这使得每一个“黑客”都变得更加困难。

这是你如何检查login.php上的密码的有效性,例如:

 $user = //random username; $querysalt = mysql_query("SELECT salt FROM password WHERE username='$user'"); while($salt = mysql_fetch_array($querysalt)) { $password = hash('md5', $_POST['userpassword'].'raNdoMStAticSaltHere'.$salt[salt]); } 

这是我以前用过的。 这是非常强大和安全的。 我自己更喜欢sha512encryption。 实际上只是把它放在哈希函数里,而不是在我的例子中是md5

如果你想更安全,你可以将unique salt储存在一个完全不同的数据库中。

首先,“哈希”(使用encryption单向函数)不是“encryption”。 在encryption中,您可以反转进程(解密)。 在哈希algorithm中,(理论上)没有可行的方法来扭转这个过程。

哈希是一个函数f,使得v不能由f(v)容易地确定。

使用哈希进行身份validation的一点是,您(或者看到哈希值的人)没有任何知道密码的可行方法(理论上)。 但是,您仍然可以validation用户是否知道他的密码。 (基本上,用户certificate他知道v使得f(v)是存储的散列)。

简单的哈希(除了弱哈希函数)的弱点是人们可以编译密码表及其对应的哈希表并使用它们(有效地)获得哈希函数的反函数。 Salting可以防止这种情况发生,因为这样就会控制散列input值的一部分,所以必须为特定的salt编译表。

所以,实际上,你存储一个salt和一个散列值,并通过散列salt和密码的组合并将其与你的散列值进行比较来进行validation。

MD5是一种单向散列函数,它可以安全地保护你的原始密码。

所以,假设您的密码是“Trufa”,并且其散列版本是06cb51ce0a9893ec1d2dce07ba5ba710

例如,当您login到新的网页时,他们会要求您input用户名和密码。 当您写入“Trufa”作为您的密码时,值06cb51ce0a9893ec1d2dce07ba5ba710被存储在数据库中,因为它被散列。

下一次login时,您将写入“Trufa”,散列值将与数据库中的值进行比较。 如果他们是一样的,你是authentication的! 提供你input正确的用户名,当然。

如果你的密码没有以散列forms存储在数据库中,一些恶意的人可能会在该数据库上以某种方式运行一个查询,并查看所有真实的密码。 这将是妥协。

而且,由于MD5是一个128位的密码函数,所以可能的组合是2 ^ 128-1 = 340282366920938463463374607431768211455。

由于有更多可能的string比这个更多,所以有可能2个string会产生相同的散列值。 这叫做碰撞。 它确保了哈希密码不能被唯一地反向工程。

腌制的唯一漏洞就是你需要知道盐是为了重构密码testing的散列。 这是通过以<algorithm>$<salt>$<hash>的forms将条目存储在authdb中得到的。 这样authdb条目可以被任何有权访问的代码使用。

你错过了重要的一步 – 盐。 这是一个独特的(每个用户,理想的情况下)额外的数据,你添加到密码散列之前。

http://en.wikipedia.org/wiki/Salt_%28cryptography%29

你的想法(salting)是众所周知的,实际上在PHP语言中是很好的实现的。 如果你使用crypt()函数,它允许你指定一个string来散列,一种方法来encryption(在某些情况下)和盐。 例如,

 $x = crypt('insecure_password', $salt); 

返回一个哈希和盐渍密码准备存储。 密码被破解的方式与我们检查密码是否正确的方式相同:我们检查用户input的密码在数据库中的散列值。 如果他们匹配,他们被authentication(AFAIK这是最常见的方式来做到这一点,如果不是唯一的话)。 使用字典单词的不安全的密码(如password )可以通过比较它们的散列和普通密码的散列来破解。 安全的密码不能被破解,但仍然可以被破解。 在密码中添加一个盐使得破解更加困难:因为黑客很可能不知道盐是什么,所以他的字典攻击是行不通的。

对于体面散列,攻击者不会颠倒散列,他们将使用彩虹表,如果每个人都使用相同的散列函数,这就是一个非常有用的暴力方法。

彩虹表的想法是,因为哈希是快速的,我可以散列你可以用作密码的每个可能的值,存储结果,并有一个哪个哈希连接到哪个密码的地图。 如果每个人只是拿着自己的密码,然后用MD5把它们散列化,那么我的散列表就可以用于任何我可以使用的密码哈希值!

这是唾沫进入的地方。如果我input用户input的密码并为每个用户添加一些不同的数据,那么由于散列是密码和一些随机数据,所以预定散列列表是无用的。 盐的数据可以存储在密码旁边,即使我得到两个也不能帮我取回密码,因为我仍然必须分别为每个用户强制哈希 – 我不能形成单一的彩虹桌一次攻击所有的哈希。

当然,理想情况下,攻击者首先不会得到散列密码的列​​表,但有些员工可以访问,所以不可能完全保护密码数据库。

除了提供盐(或种子)之外,md5是一种复杂的哈希algorithm,它使用math规则产生由于数据变化和数据吞吐量而不可逆的结果。

http://en.wikipedia.org/wiki/Cryptographic_hash_function

md5 (或者更好的说:通常是散列algorithm)被用于在数据库中安全地存储密码。 了解哈希最重要的是:哈希本身不是encryption。 (他们至多是单向encryption)。 如果你encryption了一些东西,你可以用你使用的密钥取回数据。 哈希从任意input(如string)中生成一个固定长度值,可用于查看是否使用了相同的input。

散列用于存储敏感的,重复input的数据到存储设备中。 这样做,没有人可以从哈希数据中重新创build原始input,但是可以对传入的密码进行哈希处理,并将其与数据库中的值进行比较,如果两者相同,则密码正确。

您已经指出,有可能通过使用值/散列对的数据库或产生冲突(导致散列值的不同值)来破坏algorithm。 你可以通过使用盐来掩盖这一点,从而修改algorithm。 但如果盐是已知的,可以用来再次破坏algorithm。

我喜欢这个问题。 但我认为你真的回答了你自己。

你引用的网站使用已知的,无盐的,MD5的字典查找 – 它不“破解”任何东西。

你的例子几乎是好的,除了你的应用程序需要能够每次使用相同的盐重新生成MD5。

您的示例似乎使用随机盐之一,如果您尝试将用户密码哈希与某些input进行比较,将会失败3次中的2次。

人们会告诉你也使用SHA1或SHA256做一个“更强大”的散列 – 但是人们也会争辩说它们都是“破碎的”。

这个文档是误导性的 – 它教导一个“脆弱”的概念,并以某种方式呈现它是“安全的”,因为它(保存的密码)看起来很乱。 只是互联网垃圾,不会死。 下面的链接应该把事情弄清楚(虽然你已经发现了一些好东西,好的工作。)

足够的彩虹表:你需要知道的关于安全密码scheme关于MD5(以及为什么不应该使用)与盐(例如如何阻止彩虹攻击)以及提供有用的见解(如“使用某人别人的密码系统,不要自己构build“)。 这是一个相当不错的概述。

这是关于md5碰撞方面的问题,与你的问题略有关系:

在这种情况下,md5和sha1有什么不同?

重要的部分是前3排,那就是:你必须把你的盐放在密码前面 ,如果你想要得到更强的保护, 不要以后

要简单地回答你的问题的标题,现在md5唯一真正的用途是散列大string(如文件)来产生校验和。 这些通常用于查看两个string是否相同(就文件而言,为了确保分发的文件没有被篡改,安全性经常使用校验和)。

解决您的每个内嵌问题:

密码encryption如何工作? 你将如何应用密码encryption,这实际上是有用的?

安全密码散列法是通过以纯文本forms获取密码,然后应用一个昂贵的散列函数,用一个密码安全的随机盐对其进行腌制。 请参阅Secure hash和salt for PHP密码问题以了解更多详细信息。

这个主意呢?

密码哈希不需要像这样复杂,也不应该是这样。 避免思考自己的algorithm,并坚持已经过testing的哈希algorithm。 正如上面提到的问题所提到的,密码散列的md5()已经过时多年了,所以应该避免。

你从三种不同的盐类中产生一种“随机”盐的方法并不是你所寻找的随机性。 您需要独特的随机性,适合密码安全(即使用密码安全的伪随机数字发生器(CSPRNG))。 如果您使用的是PHP 7或更高版本,那么可以使用random_bytes函数来生成密码安全的salt(对于PHP 5用户,可以使用random_compat库)。