38

加密密码的最快且安全的方法是什么(最好使用 PHP),无论您选择哪种方法,它是否可移植?

换句话说,如果我稍后将我的网站迁移到不同的服务器,我的密码会继续有效吗?

正如我被告知的那样,我现在使用的方法取决于服务器上安装的库的确切版本。

4

8 回答 8

33

如果您正在为您的登录系统选择一种加密方法,那么速度不是您的朋友,Jeff 与 Thomas Ptacek 就密码问题争论不休,得出的结论是您应该使用您能负担得起的最慢、最安全的加密方法.

来自 Thomas Ptacek 的博客:
速度正是您在密码哈希函数中不想要的。

现代密码方案受到增量密码破解程序的攻击。

增量破解者不会预先计算所有可能的破解密码。他们单独考虑每个密码散列,并通过密码散列函数提供字典,就像您的 PHP 登录页面一样。像 Ophcrack 这样的彩虹表破解器使用空间来攻击密码;像 John the Ripper、Crack 和 LC5 这样的增量破解者使用时间:统计和计算。

密码攻击游戏以破解密码 X 的时间计分。对于彩虹表,该时间取决于您的表需要多大以及搜索速度有多快。使用增量破解程序,时间取决于您可以使密码哈希函数运行多快。

你可以更好地优化你的密码哈希函数,你的密码哈希函数得到的越快,你的方案就越弱。MD5 和 SHA1,甚至像 DES 这样的传统分组密码,都被设计成速度很快。MD5、SHA1 和 DES 是弱密码哈希。在现代 CPU 上,像 DES 和 MD5 这样的原始加密构建块可以进行位切片、矢量化和并行化,以使密码搜索速度快如闪电。Game-over FPGA 实施仅需数百美元。

于 2008-08-03T12:48:36.657 回答
16

我和彼得在一起。开发人员似乎不理解密码。我们都选择(我也对此感到内疚)MD5 或 SHA1,因为它们速度很快。想一想(因为最近有人向我指出)这没有任何意义。我们应该选择一个愚蠢缓慢的散列算法。我的意思是,在事情的规模上,一个繁忙的网站会散列密码什么?每 1/2 分钟?谁在乎它是否需要 0.8 秒与服务器明智的 0.03 秒?但是这种额外的缓慢对于防止所有类型的常见暴力攻击来说是巨大的。

根据我的阅读,bcrypt 专为安全密码散列而设计。它基于河豚,并且有很多实现。

对于 PHP,请查看PHP Pass

对于任何使用 .NET 的人,请查看BCrypt.NET

于 2008-08-03T13:48:25.367 回答
9

应该指出的是,您不想加密密码,而是要对其进行哈希处理。

加密的密码可以被解密,让别人看到密码。散列是一种单向操作,因此用户的原始密码(以加密方式)消失了。


至于您应该选择哪种算法 - 使用当前公认的标准:

  • SHA-256

当你对用户的密码进行哈希处理时,一定要在其他一些垃圾中也用它来哈希处理。例如:

  • 密码:password1
  • 盐:PasswordSaltDesignedForThisQuestion

将盐附加到用户的密码:

String s = HashStringSHA256("password1PasswordSaltDesignedForThisQuestion");
于 2008-09-17T18:06:17.920 回答
7

无论您做什么,都不要编写自己的加密算法。这样做几乎可以保证(除非你是密码学家)算法中会有一个缺陷,使得破解变得微不足道。

于 2008-09-17T18:16:58.393 回答
1

我不一定要寻找最快但很好的平衡,正在开发此代码的某些服务器相当慢,散列和存储密码的脚本需要 5-6 秒才能运行,而且我已经将它缩小到散列(如果我评论它运行的散列,在 1-2 秒内)。

它不一定是最安全的,我不是为银行编码(现在),但我当然不会将密码存储为纯文本。

于 2008-08-04T23:07:15.673 回答
1

考虑使用bcrypt它用于许多现代框架,如 laravel。

于 2016-07-16T07:47:48.057 回答
0

password_hash ( string $password , int $algo [, array $options ] ). (PHP 5 >= 5.5.0,PHP 7)

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

于 2018-05-18T18:27:40.983 回答
0

插入数据库时​​使用此函数 Password_harsh($password,PASSWORD_DEFAULT); 当从数据库中选择时,您使用函数 if(password_verify($password,$databasePassword)){ 将您插入的密码与数据库中的密码进行比较

}else{
echo "password not correct";
}

这将以安全的格式对密码进行严苛

于 2019-11-09T10:05:17.823 回答