修改我的“问题”,以免打扰当地人。
如今,互联网上似乎有很多资源(包括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";
}
?>
似乎同一页面上的示例不遵循它刚刚告诉我们使用的规则(“$2a$07$”之后的 26 个字符。
回报是:
河豚:
$2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi
本质上,字符串本身确实被改变了,但几乎我的整个 SALT 值(上面提到的前 22 个字符)都处于开放状态。这不会更简单地确定我的实际字符串是什么吗?
更重要的是,这只是一个例子,但归根结底,PHP.net 等资源的依赖程度有多大?
正如我的朋友 Mugatu 曾经说过的那样:“我觉得我正在服用疯狂的药丸”。
注意:上面提到的页面是自我最初发布以来编辑的,所以我不能保证自从我提供最初的问题和示例后事情没有改变。