1

好的,我知道这个话题在stackoverflow中被提出了很多,但他们没有强调我正在寻找的答案。

我使用 md5 加密,我告诉过它(不久前我还是 php 的菜鸟)是安全的,但如果你在旧的谷歌上查找它,它已经加密和解密。

所以我开始在这里寻找其他地方。

我听说过所有的加密方法,例如 SHA-1、MD5、SHA-2、SHA-256、SHA-512 等等。

很多人说使用我正在查看的Bcrypt,它与 SHA-512 相比。

人们说使用随机盐并将其保存在您的数据库中,这很愚蠢,因为说黑客入侵了您的数据库并获取了所有密码的盐,因此在黑客解密所有密码并开始之前更改所有盐是一个小窗口到其他地方并尝试它们,例如facebook、google 和 stackoverflow

所以我的问题是这样做是最安全的方法(加密(使用 SHA-512)并使用也将存储在数据库中的随机盐)或使用硬连接到我的 php 代码中的固定盐与数据库随机盐相同的安全性。

我已经阅读了很多关于这方面的帖子,所以我想我知道我在说什么,而且我喜欢冷漠,因为我已经阅读了很多关于这方面的帖子,确切地说是 20 篇。

哦,差点忘了,如果您多次加密密码或仅与一次加密大致相同,会更安全吗?

感谢您对写得太多的帖子的帮助

我很抱歉那些让我有点困惑的人,但我没有明白其他人的帖子的意思,我开始谈论加密,但我在谈论散列字符串。

对此感到抱歉

4

5 回答 5

7

我使用 md5 加密,我告诉过它(不久前我还是 php 的菜鸟)是安全的,但如果你在旧的谷歌上查找它,它已经加密和解密。

首先是一些吹毛求疵。它是散列而不是加密。散列是一种方法。现在回答你的问题:不要md5()用来散列密码。它不再安全了。它已经坏了好几年了。不仅发现了冲突(导致相同哈希的多个值),而且 md5 可以使用任何体面的 GPU 非常非常快地被暴力破解。

很多人说使用我正在查看的 Bcrypt,它与 SHA-512 相比

你应该使用 bcrypt。这是目前密码哈希的最佳选择。

人们说使用随机盐并将其保存在您的数据库中,这很愚蠢

不,这并不愚蠢。加盐密码可防止攻击者为您的所有密码创建彩虹表。为了您的方便, ircmaxell创建了一个密码库,可以在GitHub上找到。

一些相关文章和 Stack Overflow 帖子:

更新

当 PHP 5.5 发布时,它将引入一种简单的方法来正确加密您的密码。默认情况下它将使用 bcrypt 并自动为您的密码添加盐。当将来有更好的算法可用时(例如 scrypt),它将能够使用它。有关此新功能的更多信息,请参阅RFC。它还将具有一项功能,可以检测当前散列密码的使用算法,并在用户登录到更新(/更安全)算法(如果可用)时自动更新它们。有关实现示例,请查看此 GitHub gist

如果您仍在使用旧版本的 PHP 并且无法更新,则可以使用 C API 的纯 PHP 实现,并支持 PHP >= 5.3.7。此兼容 API 使用与 C API 完全相同的实现。

注意:使用更安全的 scrypt 会更好,但是到目前为止 PHP 还不支持它。如果在某个时候确实如此,我将更新此答案。

于 2012-04-26T08:55:23.763 回答
2

您将hashingencryption混淆了。

于 2012-04-26T08:48:35.677 回答
0

我用用户名中的某些字符以及 php 代码中的字符串加盐。从理论上讲,他们需要代码和数据库来解决这个问题。

于 2012-04-26T08:49:45.857 回答
0

盐是值得的,因为它可以防止预先计算所有可能的结果。多轮也有助于减慢速度,但如果有人碰巧获得了哈希值并且有几个 GPU 可供他们使用,那么这并没有多大作用。要具体回答这个问题,如果我是你并且我可以使用 bcrypt,那么我会的。如果您决定只使用 SHA-512 哈希,请使用盐和多轮(数万轮)。

此外,MD5 和 SHA1 哈希等是单向的。从哈希中获取原始输出的唯一方法是通过蛮力或纯粹的运气猜测它。

于 2012-04-26T09:09:54.860 回答
0

2015 年 6 月更新:

正如@PeeHa 所说,PHP 5.5 包含一个内置机制和一个简短的教程/解释,用于使用 PHP 实现散列密码。您可以查看Password Hashing

使用这些方法可以进行密码散列:

  • string password_hash ( string $password , integer $algo [, array $options ] )

password_hash() 使用强大的单向散列算法创建一个新的密码散列。password_hash() 与 crypt() 兼容。因此,由 crypt() 创建的密码哈希可以与 password_hash() 一起使用。

  • boolean password_verify ( string $password , string $hash )

验证给定的哈希是否与给定的密码匹配。

您可能会收到用户的输入,因此为了防止 SQL 注入,我建议使用这些方法来清除输入:

您可以使用准备好的语句,它允许您将用户输入安全地插入到 SQL 查询中:

 $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
 $stmt->bindParam(':name', $name);
 $stmt->bindParam(':value', $value);

 $name = 'one';
 $value = 1;
 $stmt->execute();

有关@Theos answer中准备好的语句的更多信息。

其他替代方法是清除用户输入字符串:

  • string stripslashes ( string $str )

stripslashes() 的一个使用示例是当 PHP 指令 magic_quotes_gpc 处于打开状态时(在 PHP 5.4 之前它默认处于打开状态),并且您没有将此数据插入需要转义的位置(例如数据库)。例如,如果您只是直接从 HTML 表单输出数据。斜线 API

  • string mysqli::escape_string ( string $escapestr )

此函数用于创建可以在 SQL 语句中使用的合法 SQL 字符串。考虑到连接的当前字符集,给定的字符串被编码为转义的 SQL 字符串。 real_escape_string API

于 2015-06-10T08:37:04.843 回答