md5() 的用途是什么?

2022-08-30 10:38:45

我正在阅读本教程,了解一个简单的PHP登录系统

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

虽然我知道这是一个初学者的教程,你不应该把银行对账单放在这个登录系统后面,这让我开始思考加密。

因此,我继续讨论(这个网站对新手最有用的问题之一):开发人员在构建公共网站之前应该知道什么?

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

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

它没有说更多关于它,没有参考。

所以我继续自己尝试:

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

echo $enc; #will echo 06cb51ce0a9893ec1d2dce07ba5ba710

这让我想到,尽管我知道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;

如您所见,我随机将任意字符串()添加到我的md5()密码中,“使其唯一”。当然,这只是一个愚蠢的例子。$reenc = array()

我可能是错的,但除非你“自己播种加密”,否则它总是很容易逆转的。

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

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


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

提前致谢!!


答案 1

您应该有一个 like 或 .您还应该有两种不同的盐,一种(由您编写),另一种是用于该特定密码的盐。encryptionmd5sha512static saltunique salt

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

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

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

这一切都以结束:两个拼写完全相同的密码将有两个不同的 。与当前 ID 一起存储在 中。如果有人抓住,他们将为每个特定密码提供每个单一的密码。但是他们没有的是你的,这使得每个“黑客”的事情变得更加困难。hashesunique hashdatabasedatabaseunique saltstatic salt

这是您在登录时检查密码有效性的方法.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]);
}

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

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


答案 2

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

哈希是某个函数 f,使得 v 不能轻易地从 f(v) 中确定。

使用散列进行身份验证的要点是,您(或看到散列值的人)没有任何可行的方法(同样,理论上)知道密码。但是,您仍然可以验证用户是否知道他的密码。(基本上,用户证明他知道v,因此f(v)是存储的哈希)。

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

因此,实际上,您存储了一个 salt 和一个哈希值,并通过对 salt 和密码的组合进行哈希处理并将其与哈希值进行比较来进行身份验证。


推荐