什么是md5()?

Tru*_*ufa 50 php security passwords

我正在阅读本教程中的一个简单的PHP登录系统.

最后,它建议您使用md5()加密密码.

虽然我知道这是一个初学者的教程,你不应该把银行对帐单放在这个登录系统后面,这让我想到加密.

所以我继续前进(本网站为新手提供的最有用的问题之一):开发人员在构建公共网站之前应该知道什么?

它说(在安全下)你应该:

加密哈希和盐密码而不是将它们存储为纯文本.

它没有更多关于它,没有参考.

所以我继续自己尝试:

$pass = "Trufa";
$enc = md5($pass);

echo $enc; #will echo 06cb51ce0a9893ec1d2dce07ba5ba710
Run Code Online (Sandbox Code Playgroud)

这就是让我思考的问题,虽然我知道md5()可能不是加密的最强方法,但任何总能产生相同结果的东西都可以进行逆向工程.

那么使用md5()或任何其他方法加密某些东西的感觉是什么?

如果黑客获得用md5()加密的密码,他就会使用这个页面!.

那么现在的实际问题是:

  1. 密码加密如何工作?

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

我确定我理解错了,如果你能帮助我设置我的和其他人(我希望),我会很感激.

您将如何应用密码加密以使其实际有用?

  1. 这个想法怎么样?

正如我所说的那样,我可能/错误地认为整个想法是错误的,但是,这种方法是否会在真实环境中增加安全性?

$reenc = array(
 "h38an",
 "n28nu",
 "fw08d"
 );

$pass = "Trufa";

$enc = chunk_split(md5($pass),5,$reenc[mt_rand(0,count($reenc)-1)]);

echo $enc;
Run Code Online (Sandbox Code Playgroud)

如你所见,我随机地将任意字符串($reenc = array())添加到我的md5()密码"使其独一无二".这当然只是一个愚蠢的例子.

我可能错了,但除非你"亲自加密",否则它将永远是可逆的.

以上将是我的"密码保护"和加密密码的想法,如果黑客到达它,他将无法解密它,除非他可以访问原始.php

我知道这甚至没有意义,但我无法弄清楚为什么这是个坏主意!


我希望我已经足够清楚了,但这是一个很长的问题所以请求任何澄清!

提前致谢!!

Wro*_*lai 20

你应该encryption喜欢md5sha512.您还应该有两种不同的盐,a static salt(由您编写),然后还有一个unique salt特定的密码.

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

$unique_salt = hash('md5', microtime()); 
$password = hash('md5', $_POST['password'].'raNdoMStAticSaltHere'.$unique_salt);
Run Code Online (Sandbox Code Playgroud)

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

这一切都以:两个拼写完全相同的密码,将有两个不同hashes.它与当前id一起unique hash存储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]);
}
Run Code Online (Sandbox Code Playgroud)

这就是我过去使用的.它非常强大和安全.我自己更喜欢sha512加密.实际上只是把它放在哈希函数中而不是md5在我的例子中.

如果您想要更安全,可以将其存储unique salt在完全不同的数据库中.

  • 您可能还想添加有关md5如何不安全的内容,因为它太快,我建议使用b_crypt,或者如果不可用,则循环md5散列数千次.请记住,用户不关心是否需要2秒才能登录而不是1,但是人们会尝试猜测密码.您将检查密码所花费的时间增加了一倍,并大大延长了破解时间. (3认同)
  • sha和md5都设计为_fast_,不安全.如果有人能够访问您的数据库,他们可能有足够的权限来转储您的文件,即通过默默无闻保护静态盐和任何其他安全方法.散列数千次,或使用更加时间密集的散列将大大增加破解时间. (2认同)
  • @Malfist:如果我的答案与你的建议有显着差异,请另外给出答案.我们作为程序员真的应该关心内部是否有任何泄漏?这是它自己的问题. (2认同)

lij*_*jie 18

首先,"散列"(使用加密单向函数)不是"加密".在加密中,您可以反转过程(解密).在散列中,(理论上)没有可行的方法来逆转过程.

散列是一些函数f,使得不能容易地从f(v)确定v.

使用散列进行身份验证的关键是你(或者看到散列值的人)没有任何可行的方法(理论上再次)知道密码.但是,您仍然可以验证用户是否知道他的密码.(基本上,用户证明他知道v使得f(v)是存储的散列).

简单散列的弱点(除了弱散列函数)是人们可以编译密码表及其相应的散列并使用它们(有效地)得到散列函数的逆.Salting可以防止这种情况,因为哈希的输入值的一部分是受控制的,因此必须为该特定的盐编译表.

实际上,您存储salt和哈希值,并通过散列salt和密码的组合进行身份验证,并将其与哈希值进行比较.

  • +1感谢至少找到几张海报,说哈希不是一种加密形式. (3认同)

dar*_*ioo 6

MD5是一种单向散列函数,可以或多或少安全地保护您的原始密码.

所以,假设您的密码是"Trufa",其散列版本是06cb51ce0a9893ec1d2dce07ba5ba710.

例如,当您登录新网页时,他们会询问您的用户名和密码.当您将"Trufa"写为密码时,该值06cb51ce0a9893ec1d2dce07ba5ba710将存储在数据库中,因为它是经过哈希处理的.

下次登录并编写"Trufa"时,散列值将与数据库中的值进行比较.如果它们是相同的,那么您将通过身份验证!当然,为您输入正确的用户名.

如果您的密码未以数据库中的哈希形式存储,则某些恶意用户可能会以某种方式在该数据库上运行查询并查看所有真实密码.这将是妥协.

此外,由于MD5是128位加密函数,因此存在2 ^ 128-1 = 340282366920938463463374607431768211455可能的组合.

由于有更多可能的字符串,因此2个字符串可能会生成相同的哈希值.这称为碰撞.并且它确保散列密码不能进行唯一的逆向工程.


Ign*_*ams 5

salting的唯一漏洞是你需要知道salt是什么,以便重建哈希来测试密码.通过在表单中​​的authdb中存储条目来解决这个问题<algorithm>$<salt>$<hash>.这样,任何有权访问它的代码都可以使用authdb条目.