【问题标题】:encrypt filename with md5 [closed]用 md5 加密文件名 [关闭]
【发布时间】:2012-11-13 22:07:26
【问题描述】:

网站上的常见密码是用 MD5 编码的。我也在考虑将用户名编码为 MD5 中的文件名。我会在基于 Linux 的服务器上使用 PHP。用 PHP 加密文件名到 MD5 除了不解密无法区分之外,还有什么弊端吗?

<? php 
if(isset($_POST['register'])){
    $username = md5($_POST['username']);
    $email = htmlentities($_POST['email'], ENT_QUOTES|ENT_XML1);
    $password = $_POST['password'];
    $c_password = $_POST['c_password'];

    $xml = new SimpleXMLElement('<user></user>');
    $xml->addChild('password', md5($password));
    $xml->addChild('email', $email);
    $xml->asXML('users/'.$username . '.xml');

    header('Location: validate.php');
    die;
}
?>

【问题讨论】:

  • 是的,有:MD5 is broken. 如果您想要工业级哈希,请使用 SHA 系列哈希函数。此外,这不是一种完全加密的方法——理论上,数据是无法从哈希中恢复的。如果您想要真正的加密,请考虑使用 RSA。
  • 别听维亚切斯拉夫的。 MD5 很容易被任何脚本小子破解。在台式计算机上花费很短的时间,此外还有可在线搜索的 has/rainbow 表数据库。
  • 问题是这样做到底有什么意义?除非你打算让人们在他们的名字中使用问号和星号,否则通过 MD5 传递它不会给你带来任何好处。

标签: php javascript linux md5 filenames


【解决方案1】:

正如H2C03提到的,MD5坏了(见他在cmets中的链接。)还有以下因素需要考虑:

  1. 任何能破解用户名的人都能破解密码,反之亦然,所以你一无所获
  2. 这将使编写大量用户管理查询和代码成为一场噩梦
  3. 散列密码之所以有价值,是因为(理想情况下)没有办法恢复明文。为了使您的站点正常工作,您需要包含将用户名解密为明文的代码,并且已经在您系统上的黑客如果他有任何好处,只需在您的解密例程中添加一些代码以转移明文密码随着人们使用您的网站。

执行摘要:大量额外工作,即使在使用现代加密算法时也有可疑的好处。

【讨论】:

  • 这很好,但它是一个好的文件名吗?
  • 某种?如果您需要文件不能追溯到单个用户,尽管散列或随机化文件名的每个部分仍然要好得多,以防止琐碎的窥探能够绝对识别文件的所有者通过网址。
  • 澄清一下,我建议您使用sha1($username.$OriginalFilename).$FileExtension 而不是sha1($username).$OriginalFilename.$FileExtension。更安全。您也可以使用哈希目录名,但文件名不受影响,这样做的好处是在下载时保留文件名。媒体/档案下载网站场景中的一些大玩家都这样做了。
【解决方案2】:

您使用的任何 Linux 文件系统都可以接受文件名中的任何字符,目录分隔符除外。那么,为什么不将任何 / 字符替换为其他字符,或者更好的是,拒绝使用包含 / (可能还有任何其他不可打印字符)的用户名进行注册的任何尝试? “哦,但是碰撞呢”?如果你使用散列算法,你并没有消除冲突的可能性,你只是在减少它的同时增加了无用的计算复杂性。要生成唯一标识符,请使用递增值(如 Unix 使用“用户 ID”)或仅生成 uuid:http://php.net/manual/en/function.uniqid.php - 并将该映射存储在数据库中。

维护用户名到 ID 的映射是其他人所做的事情,这是有原因的。 :)

【讨论】:

  • 我想我会这样做的。当我在的时候,我也会接受他们的电子邮件地址作为用户名。出于某种原因,其中一些电子邮件会自动完成。这可能有助于在注册期间打击相同的电子邮件、多个用户。
【解决方案3】:

看起来您只是使用 md5 将用户名映射到文件名。没有错,这是一种常见的单向哈希算法。

不过我不会用它来加密密码。

【讨论】:

  • 酷,只需要一个安全的换位,不会破坏任何东西。 +1,如果你有更好的答案,或者没有其他人做。
  • 现在每个人都在问的大问题是为什么?你这样做的目的是什么?
  • 扩展可兼作用户名的适用文件名范围。
  • 如果您的唯一目标是将任何用户名字符串映射到干净的文件名,则不需要双向函数。只需将用户名作为字段之一放入文件中即可。
  • 其实我会做用户管理的。也许发现了缺点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
  • 2010-11-11
相关资源
最近更新 更多