【发布时间】:2023-10-19 03:14:01
【问题描述】:
修改我的“问题”以免打扰当地人。
现在互联网上似乎有这么多资源(包括在内),找到问题的“一个”答案可能很容易,但如何判断该答案是否有效甚至是最新的?
一个特别被问到的领域是如何使用 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 曾经说过的:“我感觉自己正在服用疯狂的药丸”。
注意:上面提到的页面是在我最初发布后编辑的,所以我不能保证自从我提供最初的问题和示例后情况没有改变。
【问题讨论】:
-
Blowfish 可以解密,因此不适合散列。
-
@sqwk -- JM4 的意思是“EksBlowfish”,一种基于 Blowfish 的散列算法 -- 这不是可逆的块密码!
-
@pst - 我不认为这是一种咆哮,但如果你必须这样称呼它。我称它为程序员和合作者在将其发布给大众之前审查他们的工作的声明。这是一般的技术状态。当人们发布关于如何做正确的事情的问题时,SO 上的人们会生气,当他们不参考像 php.net 这样的基本网站时称他们为白痴,然后反过来该网站(如我上面所展示的)几乎没有感觉。一半的 SO 推荐 sha1 或 md5 加密,网站明确指出不推荐,那么区别在哪里?
-
-1 用于比较苹果和梨。散列!= 加密
-
@fyr - 我是否将两者进行了同等比较?散列是加密不可或缺的一部分,所以是的,它们是相关的,当一个被愚弄时,对后者的期望就会随之而来。
标签: php encryption md5 blowfish crypt