PHP.net是否是"任何"PHP引用的可靠资源?

JM4*_*JM4 -1 php encryption md5 crypt blowfish

修改我的"问题",以免惹恼当地人.

现在互联网上似乎有这么多资源(包括SO),找到问题的"答案"可能很容易,但如何判断答案是否有效甚至是最新的?

特别是一个领域和一个被问到很多的领域是如何使用PHP正确处理散列和加密,以便在数据库存储中做好准备.关于SO的一个常见答案似乎总是"你有没有访问过php.net?".虽然我理解这通常会出现一个问题,其中有人问最简单的问题,但我已经开始发现一些描述似乎有冲突,更重要的是,用户示例已经过时(很多来自2008-2009).

例如:在寻找为什么以及如何使用密码哈希时:http://www.php.net/manual/en/faq.passwords.php#faq.passwords.fasthash

总之,我了解到sha1和md5是快速且计算效率高的哈希方法,它们不再适用于密码哈希.建议的方法是使用crypt()函数.

在了解有关crypt()以及特别是河豚哈希的更多信息时,页面上列出的规则如下:

http://www.php.net/manual/en/function.crypt.php

  • 以$ 2a $开始我的盐
  • 继续使用两个数值(下面的用户已经说明了这个的重要性,而php.net没有)
  • 跟着$
  • 输入22个字母数字字符

进一步阅读给出了一个例子:

<?php

    if (CRYPT_BLOWFISH == 1) {
        echo 'Blowfish:     ' . crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$') . "\n";

    }
?>
Run Code Online (Sandbox Code Playgroud)

似乎同一页面上的示例不遵循它刚刚告诉我们使用的规则("$ 2a $ 07 $"之后的26个字符.

回报是:

河豚:
$ 2a $ 07 $ usesomesillystringfore2uDLvp1Ii2e ./ U9C8sBjqp8I90dH6hi

实际上,字符串本身确实会被改变,但几乎我的整个SALT值(上面提到的前22个字符)都是敞开的.难道这不会让我更简单地确定我的实际字符串是什么吗?

更重要的是,这只是一个例子,但最终,依赖PHP.net等资源应该有多大?

正如我的朋友Mugatu曾经说过"我觉得我正在服用疯狂的药片".

注意:上面提到的页面是自我原始发布以来编辑的,所以我无法保证自从我的原始问题和示例提供后事情没有改变.

Der*_*sed 6

你是对的,互联网(一个美妙而可怕的地方)充满了关于你应该如何做到这一点的矛盾信息.我有自己的意见(我喜欢EksBlowfish用于单向密码哈希),我在这个无耻的,自私的博客插件中概述了这些意见.

一个重要的注意事项,如果你不遵循该链接.接下来的两个数字$2a$不是RANDOM.它们是在字符串上运行的EksBlowfish轮数的Log-Base-2; 基本上,每次将数字增加1(例如,$2a$07$to $2a$08$)时,计算哈希值所需的时间就会增加一倍.

这是设计 - 它允许EksBlowfish在计算上非常昂贵,并且当硬件扩展(摩尔定律)时,你可以将它恢复原状并使其再次变得昂贵.

正如我的好朋友所说,试图抵挡好饼干的唯一真正方法就是浪费时间.如果您想了解有关(a)EksBlowfish和(b)为什么要使用它的更多信息,请再次查看这个无耻的,自私的博客插件 ; 如果你愿意,可以跳到文章的最后,找到比我聪明的人写的东西的链接.

编辑

至于为什么PHP包括像SHA-1和MD5这样的东西的直接实现是因为PHP不是昨天发明的,它已经存在了20多年(以各种形式).MD5过去被认为是安全的.事情会改变的.